java - List<?> 与 List<Object> 不同时的示例

标签 java generics type-conversion

它是用java制作的,泛型不会自动从Generic<A>转换而来至Generic<SupeclassOfA> .

例如,如果写一个方法

public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

它不会接受List<Integer> 。我需要重写 List<?> 的 header 尽管代码是相同的,但它将开始工作。

那么,为什么要这么做呢?

假设我重新设计Java这样List<?>始终与 List<Object> 含义相同。我会遇到什么问题?

最佳答案

假设一个方法采用 List<Object>接受了List<Integer> 。这意味着 List<Integer>List<Object> 的子类型。如果这是真的,你可以这样做:

List<Integer> intList = new ArrayList<Integer>();
List<Object> objList = (List<Object>) intList;
objList.add("foo");
int a = intList.get(0);  // This would fail at runtime because intList.get(0) is a String.

如果你可以转换 List<Integer>List<Object>您将失去泛型提供的编译时类型安全性。

List<?>List<Object> 不同。 List<?>List某种未知类型的T 。自 T未知,无法向 List<?> 添加任何内容(null 除外)。这与 List<Object> 完全相反。您可以在其中添加任何内容。

一般来说,List<Object>很少是你所需要的。大多数时候你想要一个 List其中所有项目都具有相同的类型,例如 List<Integer>List<String> 。如果您正在编写类型不重要的方法,例如仅打印项目的示例,则参数应具有类型 List<?>

关于java - List<?> 与 List<Object> 不同时的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27897217/

相关文章:

java - 如何在Jsoup中提取这些元素

java - PDFBox 和 BouncycaSTLe 签名无效

java - 如何将类名传递给抽象父类(super class)构造函数?

Java 反射 : What does my Collection contain?

generics - 如何获得参数数量可变的整数元组的乘积?

ios - 无法将 _NSCFNumber 转换为 int

java - 如何找到 FileItemIterator 返回的 FileItemStream 的编码?

java忽略https证书验证

javascript - 对象的隐式类型强制

c# - 将数字对应的chars转换为uint