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。您可以将T
s 添加到其中,但您无法将T
输出。
【参考方案1】:
事情如下:
在doExtends(A<? extends T> b)
中,您指定b
的类型为A
,封装了可能是T
的unknown 子类的内容。因此,做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
。你基本上不知道它会是什么类。
【讨论】:
谢谢,很好的解释以上是关于java有界通配符理解问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章