4 回答
TA贡献1865条经验 获得超7个赞
原因很简单:
您可以从与 从 相同的方式读取 s。但是你不能将s添加到a(编译器禁止这样做),而在a中你可以。Object
Collection<?>
Collection
Object
Collection<?>
Collection
如果在Java 5发布后,编译器已经将每个翻译成,那么以前编写的代码将不再编译,从而破坏向后兼容性。Collection
Collection<?>
TA贡献1853条经验 获得超18个赞
原始类型和无界通配符之间的主要区别在于后者是类型安全的,也就是说,在编译级别,它检查集合中的项是否属于同一类型。编译器不允许您将字符串和整数添加到通配符类型的集合中,但它将允许您执行以下操作:<?>
List raw = new ArrayList(); raw.add(""); raw.add(1);
实际上,在无界通配符集合()的情况下,您根本无法向列表中添加任何内容,但是(来自Oracle文档):List<?> wildcard = new ArrayList<String>()
null
由于我们不知道c的元素类型代表什么,因此我们无法向其添加对象。add() 方法采用类型为 E 的参数,即集合的元素类型。当实际类型参数为 ?时,它代表某个未知类型。我们传递要添加的任何参数都必须是此未知类型的子类型。由于我们不知道那是什么类型,因此我们无法传递任何内容。唯一的例外是 null,它是每种类型的成员。
TA贡献1797条经验 获得超6个赞
尖叫:Collection<?>
请不要向我添加任何内容。我有一个严格的内容类型,...嗯,呃,我只是忘了它是什么类型。
而 a 说:Collection
这一切都很酷!你可以添加任何你喜欢的东西,我没有限制。
那么,为什么编译器不应该转换为?因为它会带来很多限制。Collection
Collection<?>
TA贡献1816条经验 获得超4个赞
一个我能想到的用例,为什么不被认为是假设我们有一个实例Collection
Collection<?>
ArrayList
现在,如果实例的类型为 or 或 ,则可以仅添加该类型(类型检查)。 不等效于 。ArrayList<Integer>
ArrayList<Double>
ArrayList<String>
ArrayList<?>
ArrayList<Object>
但是只有 ,您可以添加任何类型的对象。这可能是编译器不考虑作为(类型检查)的原因之一。ArrayList
ArrayList
ArrayList<?>
另一个原因可能是与没有泛型的Java版本向后兼容。
添加回答
举报