繁体   English   中英

列表<?>列表 = 新的 ArrayList<String> (); 列表<? extends Object>列表 = 新的 ArrayList<String> ();

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

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

这两个对象我们不能在列表中添加任何东西,如果我们尝试添加任何东西它会显示编译时错误。

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

不能向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> List <? extends Object> 就像class A {}class A extends Object {}没有区别一样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM