Java泛型擦除效果及橋方法的探討

/**
 * 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);
//    }
//}
相關文章
相關標籤/搜索