我是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
}
}
为什么会有错误?我的问题与评论中引用的问题不同
答案 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
的未知子类。但是你想要填入T
(this.getT()
生成T
)并且你无法确定你的T
是否与子类相匹配在b
内 - 这就是为什么它不起作用。
接下来转到doSuper(A<? super T> b)
- 此处b
包含未知超类 T
或可能 T
本身。这就是为什么最后一行 - 设定价值 - 完全没问题。 this.getT()
生成一个T
,您可以随时将其转换为任何超类。但是,当您获得b.getT()
的值时,您只知道T
的未知超类,但无法保证为T
}。你基本上不知道它会是什么类。