请考虑以下方法:
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);
}
什么是这两种方法之间的区别? 如果没有区别,为什么我们应该用第二个?
<?>
不允许你在列表中添加对象。 请参见下面的程序。 这是我们传递给方法列表的特定类型的<?>
。
具体手段,列表用特定类型创建并传递到<?>
方法listAll
。 不要用字混淆specific
。
具体可以是任何普通对象一样,狗,虎,字符串,对象,HashMap中,档案,整型,长....和名单是无止境的。
JLS
力<?>
为不执行 添加任何方法irrelevant objects
中称为<?>
方法一旦定义(在调用方法不限定called-listAll
列表含有) specific type
的对象。
这就像<?>
说:“不要碰我”。
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
。
public static void listAll(LinkedList<String> list)// It is now specific type, 'String'
{
list.add(new String());//works fine. Compile time it knows that 'list' has 'String'
for(Object obj : list)
System.out.println(obj);
}
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<?>
)