List
、List<?>
、List<T>
、List<E>
、List<Object>
有什么区别?
1。列表
List
:是原始类型,因此不是 typesafe
。它只会在转换错误时生成运行时错误。当 Actor 阵容不好时,我们想要一个编译时错误。不推荐使用。
2。列表>
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);
}
3。列表
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>
。它们都是一样的还是代表不同的东西?
4。列表<对象>
这会给出错误“方法 test(List<Object>)
不适用于参数 List<String>
”:
public static void test(List<Object> list){
System.out.println(list);
}
如果我尝试这个,我会得到“无法从 List<String>
转换为 List<Object>
”:
test((List<Object>) names);
我很困惑。 String
是 Object
的子类,那么为什么 List<String>
不是 List<Object>
的子类呢?
最佳答案
1) 正确
2)您可以将其视为“只读”列表,您不关心项目的类型。例如由返回列表长度的方法使用。
3) T、E 和 U 是相同的,但人们倾向于使用例如T 代表类型,E 代表元素,V 代表值,K 代表键。编译的方法说它接受一个特定类型的数组,并返回一个相同类型的数组。
4) 你不能混合橙子和苹果。如果您可以将字符串列表传递给需要对象列表的方法,您将能够将对象添加到您的字符串列表中。 (并不是所有的对象都是字符串)
关于java - List、List<?>、List<T>、List<E> 和 List<Object> 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6231973/