Java泛型:列表<;集装箱<&燃气轮机>;=新LinkedList<;集装箱<;双倍>&燃气轮机;()是禁止的吗?

Java泛型:列表<;集装箱<&燃气轮机>;=新LinkedList<;集装箱<;双倍>&燃气轮机;()是禁止的吗?,java,generics,Java,Generics,为什么我能用Java写呢 List<?> list = new LinkedList<Double>(); 它仍然不起作用,因为它推断出类型List每个参数化必须是通配符: List<? extends Container<?>> list = new LinkedList<Container<Double>>(); List>List=newlinkedlist(); 编辑:我在搜索一个解释,但没有找到(可能在那里,

为什么我能用Java写呢

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

它仍然不起作用,因为它推断出类型
List每个参数化必须是通配符:

List<? extends Container<?>> list = new LinkedList<Container<Double>>();
List>List=newlinkedlist();
编辑:我在搜索一个解释,但没有找到(可能在那里,但隐藏在500页的某个地方)

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

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

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


考虑一下如果可以的话会发生什么

List<Container<Double>> list1 = new LinkedList<Container<Double>>();
List<Container<?>> list2 = list1; // this shouldn't be allowed, because of the below
Container<String> foo = new Container<String>();
foo.add("hi");
list2.add(foo); // legal, because Container<String> is a subtype of Container<?>
Container<Double> 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 list1=newlinkedlist();
列表
process(Arrays.asList(new Container<Double>(), new Container<Double>()));
process(Arrays.asList(new Container<Double>(), new Container<String>()));
List<? extends Container<?>> list = new LinkedList<Container<Double>>();
List<Container<Double>> list1 = new LinkedList<Container<Double>>();
List<Container<?>> list2 = list1; // this shouldn't be allowed, because of the below
Container<String> foo = new Container<String>();
foo.add("hi");
list2.add(foo); // legal, because Container<String> is a subtype of Container<?>
Container<Double> bar = list1.get(0);
Double x = bar.get(0); // type error; it is actually a String object
                       // this indicates that type safety was violated