泛型类型:通配符VS原始类型的变量(Generic types : wildcards vs var

2019-07-22 01:50发布

请考虑以下方法:

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);

}

什么是这两种方法之间的区别? 如果没有区别,为什么我们应该用第二个?

Answer 1:

<?>不允许你在列表中添加对象。 请参见下面的程序。 这是我们传递给方法列表的特定类型的<?>
具体手段,列表用特定类型创建并传递到<?>方法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);
}


Answer 2:

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<?>



文章来源: Generic types : wildcards vs variables of raw types