List <! - ? - > list = new ArrayList <string>();名单<! - ? extends Object - > list = new ArrayList <string>();

时间:2015-06-15 13:16:08

标签: java generics

List<?> list = new ArrayList<String>();
List<? extends Object> list = new ArrayList<String>(); 

这两个对象我们无法在列表中添加任何内容,如果我们尝试添加它会显示编译时错误。

请告诉我我们在哪里使用它或它的用途是什么?

1 个答案:

答案 0 :(得分:0)

您无法向List<?>添加任何内容,这正是通配符提供的类型安全性(在这种情况下,与List<Object>进行比较)。只有当您想使用List时才能实现类型安全。

List<?>传达了“你不关心列表是什么”的想法。换句话说,它意味着“无论您对列表执行什么操作,无论您对列表执行什么操作,您的代码都将安全运行”。如果允许您将元素添加到列表中,则代码将无法安全地运行。您可以搜索SO以查看原因。

您希望何时使用List<?>

 public int countNonNull (List<?> list){
    int count = 0;
    for (Object item : list) {
         if (item != null) count ++;
    }
    return count;
 }

对于上面定义的函数,您可以使用任何类型的列表调用它:

countNonNull(new ArrayList<String>());
countNonNull(new ArrayList<Integer>());
countNonNull(new ArrayList<Date>());

没有通配符,你不能这样做。通过限制插入列表的能力,编译器允许您编写更通用和富有表现力的代码。

List<?>List <? extends Object>之间没有区别。就像class A {}class A extends Object {}

之间没有区别一样