有什么区别List,List<?>,List<T>,List<E>,和List<Object>?
List,List<?>,List<T>,List<E>
List<Object>
1. List
List:是原始类型,因此不是typesafe。仅在转换不良时才会生成运行时错误。当强制转换错误时,我们需要一个编译时错误。不建议使用。
List
typesafe
2. List<?>
List<?>是一个无界通配符。但是我不确定它是做什么用的吗?我可以打印一个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. 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>。它们都是相同的还是代表不同的东西?
<T>
<E>
<U>
<T,E>
4.List
这给出了错误“该方法test(List<Object>)不适用于参数List<String>”:
test(List<Object>)
List<String>
public static void test(List<Object> list){ System.out.println(list); }
如果尝试此操作,则会收到“无法从投射List<String>到List<Object>”的信息:
List<Object>”
test((List<Object>) names);
我很困惑。String是的子类Object,那么为什么不是List<String>的子类List<Object>呢?
1)正确
2)你可以将其视为“只读”列表,而不关心项目的类型。例如,可以由返回列表长度的方法使用。
3)T,E和U相同,但是人们倾向于使用T作为类型,E表示Element,V表示值,K表示键。编译的方法表示它接受了某种类型的数组,并返回了相同类型的数组。
4)你不能混合桔子和苹果。如果可以将字符串列表传递给需要对象列表的方法,则可以将对象添加到字符串列表中。(并非所有对象都是字符串)