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

标签 java generics

<分区>

我正在尝试了解下限和上限通配符的行为。

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

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

关于java - 泛型 - 下限/上限通配符行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44112556/

相关文章:

java - ImageButton 图像调整大小

java - Class 与 Class<?> 实例中的 getAnnotation()

c# - 如何在通用词典中使用通用词典?

c - C11 _Generic 与 C 预处理器的 'essence' 不矛盾吗?

Java 和 Appium : Unable to click element

java - 创建页面的左右垂直线 - Android Java iTextPdf

java - 通过java编程将java keystore转换为PFX

java - 自引用泛型并取回您自己的实例

Java DAO 工厂动态返回的对象类型

java - 使用 Optional.ofNullable 替代三元运算符是一种好习惯吗?