我读了几篇帖子,比如这里,但我无法找到解决问题的方法.
为什么我无法添加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)
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
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |