java有界通配符了解问题

时间:2017-07-26 10:47:51

标签: java

我是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
    }
}

为什么会有错误?我的问题与评论中引用的问题不同

1 个答案:

答案 0 :(得分:3)

事情如下:

doExtends(A<? extends T> b)中,您指定b类型A封装了可能是T未知子类的内容。因此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<? super T> b) - 此处b包含未知超类 T可能 T本身。这就是为什么最后一行 - 设定价值 - 完全没问题。 this.getT()生成一个T,您可以随时将其转换为任何超类。但是,当您获得b.getT()的值时,您只知道T未知超类,但无法保证T }。你基本上不知道它会是什么类。