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