List
, List<?>
, List<T>
, List<E>
和List<Object>
之间有什么区别?
List
:是原始类型,因此不是typesafe
。它只会在强制转换错误时生成运行时错误。当强制转换错误时,我们希望出现编译时错误。不建议使用。
List<?>
是一个无界通配符。但我不确定这是干什么用的?我可以打印一个List<?>
而没有问题:
public static void test(List<?> list){
System.out.println(list); // Works
}
为什么我不能在List<?>
中添加项目?
public static void test(List<?> list){
list.add(new Long(2)); // Error
list.add("2"); // Error
System.out.println(list);
}
public static void test(List<T> list){ // T cannot be resolved
System.out.println(list);
}
我不明白这个语法。我看到了类似这样的东西,它起作用了:
public <T> T[] toArray(T[] a){
return a;
}
有时,我看到<T>
,或<E>
,或<U>
, <T,E>
。它们都是一样的还是代表着不同的东西?
这将给出错误“方法test(List<Object>)
不适用于参数List<String>
”:
public static void test(List<Object> list){
System.out.println(list);
}
如果我尝试这样做,那么我得到“不能从List<String>
转换到List<Object>
”:
test((List<Object>) names);
我很困惑。__ABC0是__ABC1的子类,那么为什么__ABC2不是List<Object>
的子类呢?