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

2023-11-27

为什么在Java中我可以写

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

but not

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 to be List<Container<Double>>,并且不能分配给List<Container<?>>.

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

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

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

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


每个参数化必须使用通配符:

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

编辑:我正在搜索安吉莉卡·兰格常见问题及解答寻求解释,但没有找到(它可能在那里,但隐藏在 500 页的某个地方)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 泛型:List> = new LinkedList>() 被禁止? 的相关文章

随机推荐