它是在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<?>
的标题,虽然代码是相同的,但它会开始工作。
那么,为什么要这样做呢?
假设我重新设计Java
,以便List<?>
始终与List<Object>
相同。我将面临什么问题?
答案 0 :(得分:1)
假设一个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
的{{1}}。由于T
未知,因此无法向T
添加任何内容(List<?>
除外)。这与您可以添加任何内容的null
形成鲜明对比。
作为一般规则,List<Object>
很少是您需要的。大多数情况下,您希望List<Object>
所有项目具有相同的类型,例如List
或List<Integer>
。如果您正在编写一个类型不重要的方法,例如只打印项目的示例,则参数应该具有类型List<String>
。
答案 1 :(得分:0)
您还可以声明上限。所以你说:
List<? extends Foo> list
这将导致您只能访问列表中foo的子类。 在你的情况下写扩展对象。所以Integer是一个可以插入的子类。