一尘不染

泛型-下限/上限通配符行为?

java

我试图了解下限和上限通配符的行为。

尝试编译以下代码时遇到问题。

Collection<? extends Object> c = new ArrayList<Object>();
c.add(new Object()); // Compile time error

为了弄清楚问题,我还尝试了下限通配符。幸运的是或不幸的是,代码可以很好地编译,但是却造成了很多混乱。

Collection<? super Object> c = new ArrayList<Object>();
 c.add(new Object()); // Compiles fine

有人可以解释一下这两个代码段如何工作。如果有人可以提供其他示例/链接,那就太好了。

如果我在上面做错了什么,请纠正我。

提前致谢。


阅读 206

收藏
2020-12-03

共1个答案

一尘不染

? 表示“未知类型”。

Collection<? extends Object>表示某种对象的集合。此“某种类型”可以是作为其子类ObjectObject自身的任何类型。究竟是哪种类型?编译器不知道。

当您尝试向Object集合中添加新内容时,您不能这样做。这是因为集合的类型未知。它可以是一个ArrayList<String>。它可以是一个HashSet<Integer>。所以编译器说

“如果收藏是ArrayList<String>什么?你不能放在Object那里!”

基本上,编译器太谨慎了,您不能这样做。


Collection<? super Object>表示某种对象的集合。这种“某种类型的”可以是任何类型,它是一个超类ObjectObject本身。在这里只能是一件事-
Object,因为Object它没有超类。因此,您可以Object向收藏夹中添加新商品。

即使Object具有超类,您仍然可以添加new Object()。让我们称为的超类Object
MyClass。现在,该集合可以是MyClass或的集合Object。无论是哪种,您都可以为其添加一个Object

2020-12-03