List、List<?>、List<T>、List<E> 和 List<Object>1. 列表2. 列表<?>3. 列表<T>4. 列表<对象>

2022-08-31 06:16:41

ListList<?>List<T>List<E>List<Object> 之间有什么区别?

1. 列表

List:是原始类型,因此不是 。仅当强制转换不正确时,它才会生成运行时错误。我们希望在强制转换不好时出现编译时错误。不建议使用。typesafe

2. 列表<?>

List<?>是一个无界通配符。但我不确定这是做什么用的?我可以毫无问题地打印:List<?>

public static void test(List<?> list){
    System.out.println(list);   // Works
}

为什么我无法将项目添加到列表<>

public static void test(List<?> list){
    list.add(new Long(2));     // Error
    list.add("2");             // Error
    System.out.println(list);
}

3. 列表<T>

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);

我很困惑。StringObject 的子类,那么为什么 List<String> List<Object> 的子类呢?


答案 1

1) 正确

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

3)T,E和你是一样的,但人们倾向于使用例如T表示类型,E表示元素,V表示值,K表示键。编译的方法说它采用了某种类型的数组,并返回相同类型的数组。

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


答案 2

对于最后一部分:虽然字符串是对象的子集,但 List<String> 不是从 List<Object> 继承而来的。


推荐