java - 将元素添加到 List<?扩展父类(super class)>,需要澄清

标签 java generics

如果A extends X,下面的声明是有效的

    List<? extends X> list = new ArrayList<A>();

列表似乎包含扩展 X 的元素集合。因此,new A() 应该符合条件。

是的,它没有。这是为什么?

最佳答案

你已经快搞定了。 List<? extends X>意思是“某种类型(我实际上不知道)的列表,它是 X 的子类型(或者可能是 X 本身)”。

问题是如果 X 是,例如 Number .那么List<? extends X>表示 List<Double>List<Integer>或者你刚才说的一些其他类型,你实际上并不知道。您不能插入任何 Number进入 List<Integer> .因此,由于您不知道列表元素的类型,因此无法将任何内容 插入List<? extends Number> 中。 .但是,您可以检索 列表中的值,并且可以保证列表中包含的任何值至少Number。 .

有关更多信息,请阅读 Effective Java, 2nd Ed. 中的第 28 项:使用有界通配符提高 API 灵 active 作者 Joshua Bloch(一本每个 Java 程序员都应该放在书架上的书)。特别说明一下助记符PECS,意思是“producer extends, consumer super”,可以帮助你记住extends是什么和 super关键字在 Java 泛型中的含义以及何时应使用它们。

关于java - 将元素添加到 List<?扩展父类(super class)>,需要澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781429/

相关文章:

java - 基于某些请求属性而不是 Iplanet 服务器中的 session 的粘性

java - 在selelenium webdriver中,如何在pom运行失败的测试用例后配置邮件。将详细的程序清楚地发送给我

java - 显式调用泛型方法

java - 泛型 T 隐藏型

java - 用于 Windows 上单元测试的嵌入式 FTP 服务器 : FileUpload 551 error

java - 无法获取 com.android.build.gradle.internal.api.DefaultAndroidSourceSet 类型的源集 main 的未知属性 'output'

java - 使用 JSP 将 Excel 数据上传到 Oracle 数据库

java - JDK7 : new features related to type variables?

c# - wpf 可以绑定(bind)到泛型类吗?

Swift 泛型 : return type based on parameter type