我正在尝试了解下限和上限通配符的行为。
尝试编译以下代码时遇到问题。
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
本身。具体是哪种类型?编译器不知道。
当您尝试添加新的 Object
时到集合,你不能。这是因为集合的类型未知。它可以是 ArrayList<String>
.它可以是 HashSet<Integer>
.所以编译器说
"What if the collection is ArrayList<String>
? You can't put an Object
in there!"
基本上,编译器太谨慎了,不会让你这样做。
Collection<? super Object>
表示某种类型对象的集合。这个“某种类型”可以是任何类型,它是 Object
的父类(super class)。或 Object
本身。这里只能是一回事-Object
,因为 Object
没有父类(super class)。这就是为什么您可以添加一个新的 Object
到集合。
即使 Object
有一个父类(super class),你仍然可以添加一个 new Object()
.让我们调用 Object
的父类(super class)MyClass
.现在,集合可以是 MyClass
的集合。或 Object
.无论是哪个,您都可以添加 Object