List <! - ? - >与List <object> </object>不同的示例

时间:2015-01-12 07:33:05

标签: 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<?>的标题,虽然代码是相同的,但它会开始工作。

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

假设我重新设计Java,以便List<?>始终与List<Object>相同。我将面临什么问题?

2 个答案:

答案 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>所有项目具有相同的类型,例如ListList<Integer>。如果您正在编写一个类型不重要的方法,例如只打印项目的示例,则参数应该具有类型List<String>

答案 1 :(得分:0)

您还可以声明上限。所以你说:

List<? extends Foo> list

这将导致您只能访问列表中foo的子类。 在你的情况下写扩展对象。所以Integer是一个可以插入的子类。