多个嵌套通配符 - 参数不适用
我已经大大简化了我的问题。它是这样读的。
我试图找出为什么以下代码无法编译:
List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
l.add( new AnonType<AnonType<String>>() );
where
public class AnonType<T> {
T a;
List<T> b;
}
编译器错误表明 add 不适用于给定的参数。 OTOH,以下仅包含 1 层嵌套通配符的代码可以完美编译:
List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
以下内容按预期编译:
问题是泛型是类型不变的。
考虑一个更简单的示例:
Animal
到Dog
的强制转换(例如Dog extends Animal
)...List
不是List
List
的捕获转换?将 Animal>
扩展为List
现在,此场景中会发生以下情况:
Set
到Set
的捕获转换代码>设置<字符串>...Set>
不是Set>
Set>
扩展为Set>
因此,如果您想要一个>、
List
,您可以在其中添加 < code>SetSet>
等,则T
是 NOTSet>
,而是Set>
。相关问题
列表<列表>
List;动物 = new ArrayList()
?
和
之间有什么区别?另请参阅
The following compiles as expected:
The problem is that generics is type invariant.
Consider the simpler example:
Animal
toDog
(e.g.Dog extends Animal
)...List<Animal>
IS NOT aList<Dog>
List<? extends Animal>
to aList<Dog>
Now here's what happens in this scenario:
Set<?>
toSet<String>
...Set<Set<?>>
IS NOT aSet<Set<String>>
Set<? extends Set<?>>
toSet<Set<String>>
So if you want a
List<T>
where you can add aSet<Set<String>>
,Set<Set<Integer>>
, etc, thenT
is NOTSet<Set<?>>
, but ratherSet<? extends Set<?>>
.Related questions
List<List<? extends Number>>
List<Animal> animals = new ArrayList<Dog>()
?<E extends Number>
and<Number>
?See also
它无法编译,因为语句的
Pair<,>
中的第二个参数的类型是String
并且该类型可能不是该类型的“未知”类型被用在声明中。我认为如果将?
替换为Object
,它就会编译。当然,您将失去编译时类型检查。It doesn't compile because the type of the second argument in the
Pair<,>
of the statement isString
and that type might not be the "unknown" type that was used in the declaration. I think it will compile if you replace the?
withObject
. Of course, you will then lose compile-time type-checking.