它是用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/