我正在阅读有关泛型中通配符的Java教程。在下面的代码中:
void printCollection(Collection<Object> c) {
for (Object e : c) {
System.out.println(e);
}
}
这是否意味着集合c
将类型object
作为其元素,而我们不能调用c.add("apple")
,因为“ apple”是一个字符串,并且for循环会object
从集合中获取任何元素c
?
但是我不明白下面的代码,
void printCollection(Collection<?> c) {
for (Object e : c) {
System.out.println(e);
}
}
此代码使用通配符,表示“元素类型匹配任何内容的集合”。这是否意味着我们可以在任何类型的对象添加到它,比如c.add("string");
,c.add(1);
和c.add(new apple());
?并且for循环e
从collection中获取任何对象c
,如果c
不是object
类型,则说c
的元素为Integer。此代码有效吗?这是否意味着应该强制转换?
您几乎完全倒退了。
一个Collection<Object>
可以包含Object
和它的子类,由于一切(包括String
)是的子类Object
,你可以这样的集合添加任何东西。但是,除了它们的内容外,您无法对其内容做任何假设Object
。
另一方面,A Collection<?>
仅包含特定未知类型(及其子类)的实例,但是由于您不知道它是哪种类型,因此您无法null
在此类集合中添加任何内容(除外),也不能对其进行任何假设内容(除了它们是Object
s,因为所有内容都是)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句