java - List、List<?>、List<T>、List<E> 和 List<Object> 的区别

标签 java generics

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

我很困惑。 StringObject 的子类,那么为什么 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/

相关文章:

java - 无法使用我的 POJO 解析构造函数 ArrayAdapter

java - 如何在 Java 中转移分布中的数据

java - 如何使我的自定义链表使用泛型?

java - 我什么时候必须沮丧一些事情?

java - Flyway Java 迁移在命令行工具中不起作用

java - 在 Java Graphics2D 中,文本如何在矩形上居中对齐?

Java扩展了通用原型(prototype)

Java XML-RPC 和原始类型

java - 在 Java 泛型的情况下,向后兼容性到底意味着什么?

java - 如何使用方法引用作为 future 的回调?