Java 泛型 : List<Container<? >> = new LinkedList<Container<Double>>() 被禁止?

标签 java generics

我怎么会用Java写

List<?> list = new LinkedList<Double>();

但不是

List<Container<?>> list = new LinkedList<Container<Double>>();

Container 就像是

public class Container<T> { ... }

这是因为我有一个接受 List<Container<?>> 的方法,我想使用 Arrays.asList 将参数传递给它:

process(Arrays.asList(new Container<Double>(), new Container<Double>()));

但是语言不允许这样做,因为它推断出 Arrays.asList 的类型成为List<Container<Double>> ,并且不能分配给 List<Container<?>> .

如果我在调用中添加一个字符串参数化容器,

process(Arrays.asList(new Container<Double>(), new Container<String>()));

它仍然不起作用,因为它推断出类型 List<Container<? extends Serializable & Comparable<?>>>对于 Arrays.asList。只有当我传入既不是 Comparable 也不是 Serializable 的东西时,它才能正常工作。

当然,我可以进行强制转换并让编译器关闭,但我想知道我是否在这里做错了什么。

最佳答案

每个参数化必须是通配符:

List<? extends Container<?>> list = new LinkedList<Container<Double>>();

编辑:我正在搜索 Angelika Langer's FAQ寻求解释,但没有找到(它可能在那里,但隐藏在 500 页中的某个地方)。

考虑这一点的方法是每个参数化都是独立的,除非您明确说明,否则编译器不会推断有关参数化的信息。

关于Java 泛型 : List<Container<? >> = new LinkedList<Container<Double>>() 被禁止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/440262/

相关文章:

entity-framework - 是否有通用方法来测试数据库中是否存在对象?

java - 通用 lambda 不适用于参数

java - 使用 Android WebViewClient 启用特定 SSL 协议(protocol)

java - PowerScript "CHOOSE CASE"是否有 Java 等效项?

java - 在 Java 中, "5/0"语句不会在我的 Linux 机器上触发 SIGFPE 信号,为什么?

swift - Swift 的广义类型约束

c - C11 中 _Generic 的语法和示例用法

java - 在 iText 元素上添加阴影效果

java - 如何在eclipse插件项目中使用文件的相对路径?

c# - 这个通用继承是如何完成的(内部)?