Javagenerics:List <Container > = new LinkedList <Container >()被禁止?

为什么用Java,我可以写

List list = new LinkedList(); 

但不是

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

容器就是这样的东西

 public class Container { ... } 

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

 process(Arrays.asList(new Container(), new Container())); 

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

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

 process(Arrays.asList(new Container(), new Container())); 

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

当然,我可以进行演员表并让编译器闭嘴,但我想知道我在这里做错了什么。

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

 List> list = new LinkedList>(); 

编辑:我正在搜索Angelika Langer的常见问题解答 ,但没找到一个(它可能在那里,但隐藏在500页的某个地方)。

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

编辑:我正在搜索Angelika Langer的常见问题解答,但没找到一个(它可能在那里,但隐藏在500页的某个地方)。

非常感谢您的回答。 我在常见问题解答中找到了一个解释,经过一番眯着眼睛看,我觉得我明白了。

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#What%20do%20multilevel%20wildcards%20mean

考虑如果可能会发生什么。

 List> list1 = new LinkedList>(); List> list2 = list1; // this shouldn't be allowed, because of the below Container foo = new Container(); foo.add("hi"); list2.add(foo); // legal, because Container is a subtype of Container Container bar = list1.get(0); Double x = bar.get(0); // type error; it is actually a String object // this indicates that type safety was violated 

但是,使用List> List>没有这个问题,因为你不能把任何东西(除了null )放到这个类型的列表中(因为没有类型可以保证是“ ? extends Container ”的子类型) 。