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 extends Container>> list = new LinkedList>();
编辑:我正在搜索Angelika Langer的常见问题解答 ,但没找到一个(它可能在那里,但隐藏在500页的某个地方)。
考虑这个问题的方法是每个参数化都是独立的,除非您明确说明,否则编译器不会推断出有关参数化的信息。
编辑:我正在搜索Angelika Langer的常见问题解答,但没找到一个(它可能在那里,但隐藏在500页的某个地方)。
非常感谢您的回答。 我在常见问题解答中找到了一个解释,经过一番眯着眼睛看,我觉得我明白了。
考虑如果可能会发生什么。
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 extends Container>>
List extends Container>>
没有这个问题,因为你不能把任何东西(除了null
)放到这个类型的列表中(因为没有类型可以保证是“ ? extends Container>
”的子类型) 。