使用as方法参数时,通配符(?)和类型参数(T)有何不同

时间:2017-09-28 12:04:44

标签: java generics

 public class Util {

   public static <T> void printList(List<T> list){
    for (Object obj : list){
        System.out.println(obj);
    }
 }

 public static void printListWithWildCard(List<?> list){
    for (Object obj : list){
        System.out.println(obj);
     }
   }
 }



 public class Main {

   public static void main(String arg[]){

    Util.printList(Arrays.asList("test",2,3));
    Util.printListWithWildCard(Arrays.asList("test",2,3));
    }
  } 

printList() printListWithWildCard()方法中,将参数作为List<T> list接受并将参数作为List<?> list接受时有什么区别??

2 个答案:

答案 0 :(得分:0)

在这两种方法中,你实际上只是打印列表的内容,这样可以欺骗你的思想,但真正的问题是在这种方法中,

 printListWithWildCard(List<?> list)

java不知道列表持有什么阻止你用它做一些操作......

让我用这个例子解释自己:

public static <T> void printList(List<T> list) {
    list.add(list.get(0));

}

public static void printListWithWildCard(List<?> list) {
    list.add(list.get(0));

}

现在尝试编译该代码,您将看到出现错误:

  

类型List中的方法add(capture#1-of?)不是   适用于参数(捕获#2-of?)

答案 1 :(得分:0)

在使用List<T>时,我们将此列表指定为特定对象的列表。

喜欢,如果我们要创建Person对象的列表。然后我们可以将其称为List<Person>

但是如果Employee是Person类的子类,并且如果我们想要Person的列表或Person的子类列表那么我们可以使用通配符。

赞,List<? extends Person>然后我们可以将列表作为List<Person>List<Employee>传递。

如果您将列表定义为List<T>和| List`,则当前两者都相同,没有区别。但实际使用通配符是为了定义任何对象的子类或父类。