/** * most of the example code is quoted from * {@link http://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html} * * 此用例說明 * 1.java的泛型擦除效果 * 2.java編譯器爲了在泛型中實現多態而專門增長「橋方法」 * * @author wenziheng * */ public class TestErasure { @Test public void testBridgeMethod(){ MyNode mn = new MyNode(5); Node n = mn; // A raw type - compiler throws an unchecked warning try{ n.setData("Hello"); // Causes a ClassCastException to be thrown. }catch(ClassCastException cce){ Assert.assertTrue(cce instanceof ClassCastException); } Integer x = mn.data; Assert.assertTrue(5 == x); } } class Node<T> { public T data; public Node(T data) { this.data = data; } public void setData(T data) { System.out.println("Node.setData"); this.data = data; } } class MyNode extends Node<Integer> { public MyNode(Integer data) { super(data); } // 橋方法是編譯器爲了解決擦除後泛型不能實現多態而添加的 // 有了橋方法,就能讓泛型也有多態。感受上就是先調用setData(Object data)而後轉換到setData(Integer data) // 因此,ClassCastException也會發生在這裏 // // public void setData(Object data) { // setData((Integer) data); // } public void setData(Integer data) { System.out.println("MyNode.setData"); super.setData(data); } } // //通過擦除,編譯器沒有添加橋方法前, Node 和 MyNode: // //public class Node { // // public Object data; // // public Node(Object data) { this.data = data; } // // public void setData(Object data) { // System.out.println("Node.setData"); // this.data = data; // } //} // //public class MyNode extends Node { // // public MyNode(Integer data) { super(data); } // // public void setData(Integer data) { // System.out.println("MyNode.setData"); // super.setData(data); // } //}