在Java中,据说使用“扩展通配符”读取数据结构,并使用“超级通配符”将某些内容放入其中。我能理解第一个,但不能理解。

第一个(用户扩展通配符即可)是可以理解的:

Class B --extends--> Class A
Class C --extends--> Class A

public static void doSomething(List<? extends A> list, int index) {
    list.set(0, new ClassC());
}


而doSomething则用classB的实例列表来调用。好吧...这是错误的,我明白了。

但!我没有超级通配符的规则。为什么从List<? super A>读取会有危险?

如果您能给我一个定义之外的例子,我将不胜感激。我已经读了一些文本,包括Oracle Wildcards

最佳答案

由于类型擦除,<A>是什么?如果通配符<?><A>家族的一部分...如何确定<A>?此时我们需要<A super Object>未定义。这是类型擦除的经典定位问题。

想象一下情况:
<? extends MyFavoriteTreeOfClasses>

复杂之后,编译器和运行时会意识到<?>必须是Class<MyFavoriteTreeOfClasses>的一部分。

由于出现了这种情况,我们知道我们正在使用Java,并且该语言使用了类型擦除。由于在编译时会被擦除

我们知道在编译之后,绑定到(MyFavoriteTreeOfClasses)的范围...但是当以纯擦除类型处理A时,这是编译之后的对象...当处理左侧分配时...



? extends MyFavoriteTreeOfClasses = Object




那么最低形式?是MyFavoriteTreeOfClasses的接口

...由于MyTreeInTheFavorites对其进行了扩展...由于对象未实现<?>,因此不是MyFavoriteTreeOfClasses

关于java - 从 Collections 中阅读时为什么不使用 super 通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52901050/

10-13 04:32