【发布时间】:2017-07-23 13:53:55
【问题描述】:
我怎么理解?延伸..和? super .. 自己工作,哪些泛型类型是可能的,但我就是不明白这个层次结构如何实现以下内容:
-> 表示扩展
等级为 X(最低),A 到 E(最高)
接口是F
X -> A(实现 F)-> B -> C -> E(实现 F)
还有 D -> E
public class Node<T extends ClassE> {
private T info;
public T getInfo() {
return info;
}
public void setInfo(T info) {
this.info = info;
}
}
public static void main (String [] args){
Node<? super ClassB> n2 = new Node<ClassC>();
// this makes sense, since Node accepts below E and above B
InterfaceF i2 = n2.getInfo();
// how? Not only outside of <? extends E> but also getting value even though
// <? super B> is defined above, what's up with PECS?
n2.setInfo(new ClassX());
// also.. how? I'm setting a class that's out of the allowed range +
// seemingly violating the PECS for <? extends E>
}
正如您所看到的,在组合它们时我完全感到困惑,而且让这些声明毫无问题地通过编译器让我感到非常惊讶。 我在某处读到,在 Java 中不可能同时使用这两种界限,但那它是如何工作的呢?
【问题讨论】:
-
你确定这个
Node<? super ClassB> n2 = new Node<ClassC>();编译了吗?参考 n2 需要Node参数类型为 B 或更高,而您试图传递低于继承层次结构中 B 的 C。 -
我没有分配任何值来测试它,但我完全能够执行程序,我 100% 确定
-
关于层次结构,E是最高的,X是最低的,很抱歉造成混淆。所以A扩展B,B扩展C,C扩展E
-
PECS 只是一个内存设备,实际的 Java 语言规则是抽象的,不涉及生产者/消费者关系等具体模式。
标签: java generics extends super