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