Java泛型,嵌套的通配符集合

bpg*_*rgo 27 java generics wildcard

编译(1.6)

List<? extends Object> l = new ArrayList<Date>();
Run Code Online (Sandbox Code Playgroud)

但事实并非如此

List<List<? extends Object>> ll = new ArrayList<List<Date>>();
Run Code Online (Sandbox Code Playgroud)

有错误的

Type mismatch: cannot convert from ArrayList<List<Date>> to List<List<? extends Object>>
Run Code Online (Sandbox Code Playgroud)

有人能解释为什么吗?谢谢

编辑:编辑为后续

Voo*_*Voo 17

那么解释是正确的,但我认为添加实际的工作解决方案也是一件好事;)

List<? extends List<? extends Object>>
Run Code Online (Sandbox Code Playgroud)

工作得很好,但显然这种集合的使用受到通用集合的通常限制的限制(但是对于更简单的List <?extends Date>也是如此)


Mic*_*rdt 12

因为它会打破类型安全:

List<List<Object>> lo = new ArrayList<List<Object>>();
List<List<? extends Object>> ll = lo;
List<String> ls = new ArrayList<String>();
ll.add(ls);
lo.get(0).add(new Object());
String s = ls.get(0); // assigns a plain Object instance to a String reference
Run Code Online (Sandbox Code Playgroud)

  • @Voo看到一篇非常古老的论文"关于参数类型的基于方差的子类型".分析了这两种方法的优缺点.Java走了一条路,C#走了另一条道路,但没有什么新东西.C#的方法在简单的情况下看似简单,但正如文章所述,复杂性很容易变得难以管理.(我不赞赏C#人将它呈现为他们发明的东西,并且没有缺陷而神奇) (2认同)