gpt4 book ai didi

java - 将对象添加到具有两种类型的通用列表

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:25 25 4
gpt4 key购买 nike

我读了一些帖子,例如 here但我找不到解决问题的方法。

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

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

编辑

我试图简化问题。当我这样做时:

 A<B<?>> abcv=new A<B<String>>();

我收到错误:类型不匹配:无法从 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>>());

最佳答案

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<?>SuperClazB<String> 是本例中的 SubClaz)。

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

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

关于java - 将对象添加到具有两种类型的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54004281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com