代码之家  ›  专栏  ›  技术社区  ›  Arian

为什么不在读取集合时使用超级通配符

  •  0
  • Arian  · 技术社区  · 7 年前

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   AnthonyJClink    7 年前

    <A> <?> 是这个计划的一部分 <A> 家庭。。。怎么可能 < <A super Object> 未定义。这是典型的类型擦除目标问题。

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

    在复杂化之后,编译器和运行时意识到 <?> 必须属于 Class<MyFavoriteTreeOfClasses> .

    由于这个例子,我们知道我们是用java工作的,而且语言使用类型擦除。因为它在编译时会被删除

    我们知道投诉之后,必然会涉及到(MyFavoriteTreeOfClasses)的范围。。。但在处理纯擦除类型中的对象时,这是编译后的对象。。。在处理左侧赋值时。。。


    ? extends MyFavoriteTreeOfClasses = Object 
    

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

    ... 自从 MyTreeInTheFavorites <?> 因为对象不实现 MyFavoriteTreeOfClasses