一尘不染

Java List,List <?>,List <T>,List <E>和List <Object>之间的区别

java

有什么区别List,List<?>,List<T>,List<E>,和List<Object>

1. List

List:是原始类型,因此不是typesafe。仅在转换不良时才会生成运行时错误。当强制转换错误时,我们需要一个编译时错误。不建议使用。

2. 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>。它们都是相同的还是代表不同的东西?

4.List

这给出了错误“该方法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>呢?


阅读 953

收藏
2020-03-18

共1个答案

一尘不染

1)正确

2)你可以将其视为“只读”列表,而不关心项目的类型。例如,可以由返回列表长度的方法使用。

3)T,E和U相同,但是人们倾向于使用T作为类型,E表示Element,V表示值,K表示键。编译的方法表示它接受了某种类型的数组,并返回了相同类型的数组。

4)你不能混合桔子和苹果。如果可以将字符串列表传递给需要对象列表的方法,则可以将对象添加到字符串列表中。(并非所有对象都是字符串)

2020-03-18