我有一个方法,其参数应该是"任何事物的列表".该方法不会修改List的内容.将此方法定义为更正确
void foo(List<?> list) {
}
Run Code Online (Sandbox Code Playgroud)
要么
void foo(List<Object> list) {
}
Run Code Online (Sandbox Code Playgroud)
究竟有什么区别?
aio*_*obe 16
简短的回答,使用List<?>将允许你接受像List<String>使用List<Object>时不会.
[...]这是使用泛型(以及新的for循环语法)编写它的天真尝试:
Run Code Online (Sandbox Code Playgroud)void printCollection(Collection<Object> c) { for (Object e : c) { System.out.println(e); } }问题是这个新版本比旧版本更有用.虽然可以使用任何类型的集合作为参数调用旧代码,但新代码仅采用
Collection<Object>,正如我们刚刚演示的那样,它不是所有类型集合的超类型!
那么各种收藏品的超类型是什么?它是写的Collection<?>(发音为"未知的集合"),即元素类型与任何东西匹配的集合.由于显而易见的原因,它被称为通配符类型.我们可以写:Run Code Online (Sandbox Code Playgroud)void printCollection(Collection<?> c) { for (Object e : c) { System.out.println(e); } }现在,我们可以用任何类型的集合来调用它.
具有List<Object>参数化类型Object,这本质上意味着您可以添加列表中的所有对象。
然而,List<?>这意味着这是一个未知数列表。只要您不打算向列表中添加任何内容,它本质上是相同的List<Object>,但您将不得不担心以下情况:
List<?> unknownList = new ArrayList<String>();
unknownList.add(new Object()); //Compilation error.
Run Code Online (Sandbox Code Playgroud)
(?在本例中)意味着您只能添加 的值String或者是 的子类型String。
如果您只是要迭代列表并检索值,List<?>则List<Object>本质上是相同的。
更多信息请点击这里。