java有界通配符理解问题[重复]

Posted

技术标签:

【中文标题】java有界通配符理解问题[重复]【英文标题】:java bounded wildcards understanding issue [duplicate] 【发布时间】:2018-01-01 15:28:20 【问题描述】:

我是 Java 新手,我在网上阅读了很多关于 ? super T? extends T 的文章,但我仍然不明白。这是我的例子:

public class A<T> 

    private T t;

    public T getT() 
        return t;
    

    public void setT(T t) 
        this.t = t;
    

    public void doExtends(A<? extends T> b) 
        T t = b.getT();      //ok
        this.setT(b.getT()); // ok
        b.setT(this.getT()); // error
    
    public void doSuper(A<? super T> b) 
        T t = b.getT();       // error
        this.setT(b.getT()); // error
        b.setT(this.getT()); // ok
    

为什么会出现错误?我的问题与 cmets 中引用的问题不同

【问题讨论】:

什么错误?你能告诉我们堆栈跟踪吗? @ItamarG3 在代码中阅读我的推荐......它不会编译 但是异常的类型是什么?我注意到是什么行导致了这种情况,但我无法确切知道抛出了哪个异常。顺便说一句,不要担心否决票。如果您阅读(将来时)How to Ask 页面,那么我敢肯定在您发布的未来问题中这种情况会减少 @ItamarG3 没有抛出异常,OP有编译错误。 在doSuper b.getT()中返回一个超类型给T,它可能是一个Object。您可以将Ts 添加到其中,但您无法将T 输出。 【参考方案1】:

事情如下:

doExtends(A&lt;? extends T&gt; b) 中,您指定b 的类型为A,封装了可​​能是Tunknown 子类的内容。因此,做T t = b.getT() 是完全可以的,因为b.getT() 产生了extends T 的东西(所以你可以转换为T)。 this.setT(b.getT()) 也是如此 - 相当于 this.setT(t)。现在让我们看一下方法的最后一行b.setT(...)。如前所述,A 包含T未知子类。但是您想填充 Tthis.getT() 产生 T)并且您不能确定您的 T 是否匹配可能在 b 中的 子类 - 这就是它的原因不工作。

接下来是doSuper(A&lt;? super T&gt; b) - 这里b 包含T可能 T 本身的未知超类。这就是为什么最后一行 - 设置值 - 非常好。 this.getT() 产生一个 T ,您始终可以将其强制转换为任何超类。但是,当您使用b.getT() 获得值时,您只知道它是T未知超类,但不保证T。你基本上不知道它会是什么类。

【讨论】:

谢谢,很好的解释

以上是关于java有界通配符理解问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以使用有界通配符作为参数而不是方法中的返回类型? [复制]

java遗珠之泛型通配符

java遗珠之泛型通配符

使用通配符导入 java 包的含义 [重复]

java泛型

深入理解Java泛型协变逆变泛型通配符自限定