关于java编程思想P393的一些见解

public class GenericWriting {
    static  void WriteExact(List list,T item){
        list.add(item);
    }
    static List sonList=new ArrayList();
    static List fatherList=new ArrayList();
    static void f1(){
        WriteExact(sonList,new Son());
        WriteExact(fatherList,new Son()); //Error(书中这里标明的是Error)
    }
    static  void WriteExact1(List list,T item){
        list.add(item);
    }
    static void f2(){
        WriteExact1(sonList,new Son());
        WriteExact1(fatherList,new Son());
    }
    public static void main(String[] args) {
        //TODO
    }
}
 代码中标的Error处   在java编程思想中显示这里是错误的 可是运行时却没有报错
 这是因为我们传入两个不同的T
 如果编译时把T识别的是Father那就没错
 如果编译时把T识别的是Son的话那就出错了
 我们这里可以使用显示的泛型方法(p363)就可以看出来了:

 GenericWriting.WriteExact(fatherList,new Son());//true
 GenericWriting.WriteExact(fatherList,new Son());//error
 所以java编程思想的例子应该是第二种情况
 我们执行的是第一种情况(应该和JDK有关)

你可能感兴趣的:(逆变,泛型)