List<?> list = new ArrayList<String>();
List<? extends Object> list = new ArrayList<String>();
这两个对象我们不能在列表中添加任何东西,如果我们尝试添加任何东西,它会显示编译时错误。
请告诉我我们在哪里使用它或它将使用什么?
你不能向List<?>
添加任何东西的事实正是通配符提供的类型安全(好吧,在这种情况下与List<Object>
相比)。只有当您想使用该列表时,才能实现这种类型安全性。
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 {}
之间没有区别一样