使用两种类型将对象添加到通用列表

use*_*222 5 java generics

我读了几篇帖子,比如这里,但我无法找到解决问题的方法.

为什么我无法添加d?它是Object的子类型... d的类型:A<B<X>>

 List<A<B<? extends Object>>> rv=new LinkedList<>();
 rv.add(d); //not working
Run Code Online (Sandbox Code Playgroud)

编辑

我试图简化问题.当我做:

 A<B<?>> abcv=new A<B<String>>();
Run Code Online (Sandbox Code Playgroud)

我收到错误:类型不匹配:无法转换 A<B<String>> to A<B<?>>

但是,String与"?"兼容 - 那为什么不工作?我想在列表中添加元素,其中最后一个类型可以是任何东西,如下所示:

List<A<B<?>>> rv=new LinkedList<>();
rv.add(new A<B<X>>());
rv.add(new A<B<String>>());
rv.add(new A<B<Integer>>());
Run Code Online (Sandbox Code Playgroud)

osk*_*vli 3

List<SubClaz>不是List<SuperClaz>Java 中的子类型。这就是使用通配符的原因:List<SubClaz>是 的子类型List<? extends SuperClaz>

现在举个A<B<?>> abcv=new A<B<String>>();例子:

通过添加通配符,您将创建 的B<String>子类型B<?>,但由于它们也被另一种类型包装A,所以我们回到了第一个问题:
A<B<String>>不是 的子类型A<B<?>>
(注意,在本例中B<?>是 the SuperClaz,并且B<String>是 the SubClaz)。

你可以用同样的方法解决这个问题;通过添加另一个通配符:
A<B<String>>()是 的子类型A<? extends B<?>>

请记住,这不允许您根据需要读取或操作列表。搜索协变和逆变以获取更多详细信息。这是一个很好的: http: //bayou.io/draft/Capturing_Wildcards.html