通用类型:通配符和原始类型的变量

时间:2013-03-20 07:24:35

标签: java oop generic-collections

考虑以下方法:

public static void listAll(LinkedList list) {

    for(Object obj : list)
        System.out.println(obj);

}

public static void listAll(LinkedList<?> list) {

    for(Object obj : list)
        System.out.println(obj);

}

这两种方法有什么区别?如果没有差异,我们为什么要使用第二个呢?

2 个答案:

答案 0 :(得分:4)

<?>不允许您在列表中添加对象。请参阅以下程序。它是我们传递给方法<?>的特定类型的列表。
具体方法,列表是使用特定类型创建的,并传递给<?>方法listAll。不要与 specific混淆。
具体可以是任何普通对象,如Dog,Tiger,String,Object,HashMap,File,Integer,Long ....并且列表是无穷无尽的。
JLS forces {{一旦定义了(在调用方法中未定义),<}> 执行添加调用<?>方法中的任何irrelevant objects的方法在包含<?>对象的called-listAll列表中。
就像specific type“不要碰我”。

<?>

现在让我们看一下不同的场景。当我们声明特定类型如Dog,Tiger,Object,String .....会发生什么。我们将方法更改为public static void listAll(LinkedList list) { list.add(new String()); //works fine for(Object obj : list) System.out.println(obj); } public static void listAll(LinkedList<?> list) { list.add(new String()); //compile time error. Only 'null' is allowed. for(Object obj : list) System.out.println(obj); }

specific type

答案 1 :(得分:1)

List是原始类型,List<?>是带有通配符参数的泛型类型。

假设我们有以下变量:

List<?> a;
List<String> b;
List c;

作业b=a会产生编译时错误(List<String>无法分配给List<?),但c=a编译正确(List<String>可分配到原始类型List以与不使用泛型的遗留代码兼容)。

作业b=c提供了编译时警告(List<?>无法分配给List<String>),但a=c编译正确(List<String>可分配给List<?> {{1}})