我试图了解下限和上限通配符的行为。
尝试编译以下代码时遇到问题。
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
有人可以解释一下这两个代码段如何工作。如果有人可以提供其他示例/链接,那就太好了。
如果我在上面做错了什么,请纠正我。
提前致谢。
? 表示“未知类型”。
?
Collection<? extends Object>表示某种对象的集合。此“某种类型”可以是作为其子类Object或Object自身的任何类型。究竟是哪种类型?编译器不知道。
Collection<? extends Object>
Object
当您尝试向Object集合中添加新内容时,您不能这样做。这是因为集合的类型未知。它可以是一个ArrayList<String>。它可以是一个HashSet<Integer>。所以编译器说
ArrayList<String>
HashSet<Integer>
“如果收藏是ArrayList<String>什么?你不能放在Object那里!”
基本上,编译器太谨慎了,您不能这样做。
Collection<? super Object>表示某种对象的集合。这种“某种类型的”可以是任何类型,它是一个超类Object或Object本身。在这里只能是一件事- Object,因为Object它没有超类。因此,您可以Object向收藏夹中添加新商品。
Collection<? super Object>
即使Object具有超类,您仍然可以添加new Object()。让我们称为的超类Object MyClass。现在,该集合可以是MyClass或的集合Object。无论是哪种,您都可以为其添加一个Object。
new Object()
MyClass