考虑以下方法:
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);
}
这两种方法有什么区别?如果没有差异,我们为什么要使用第二个呢?
答案 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}})