泛型 - 下限/上限外卡行为?

Sar*_* UK 7 java generics

我试图了解低级和上级通配符的行为.

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

Collection<? extends Object> c = new ArrayList<Object>();
c.add(new Object()); // Compile time error
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我也尝试了下限外卡.幸运或不幸的是,代码编译得很好但却造成了很多混乱.

Collection<? super Object> c = new ArrayList<Object>();
 c.add(new Object()); // Compiles fine
Run Code Online (Sandbox Code Playgroud)

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

如果我上面做错了,请纠正我.

提前致谢.

Swe*_*per 7

? 意思是"未知类型".

Collection<? extends Object>表示某种类型对象的集合.这种"某种类型的"可以是任何类型的子类ObjectObject本身.究竟是哪种类型?编译器不知道.

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

"如果收藏品ArrayList<String>怎么办?你不能放在Object那里!"

基本上,编译器过于谨慎,不允许你这样做.


Collection<? super Object>表示某种类型对象的集合.这种"某种类型"可以是任何类型的超类Object或其Object自身.它只能是一件事 - Object因为Object没有超类.这就是为什么你可以添加一个新Object的集合.

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