在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/