我怎么会用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/