我正在尝试一些泛型并注意到了这一点。
class D extends C {}
class C extends B {}
class B extends A {}
class A {}
class Z<E extends B> {}
class temp {
public static void main(String[] args) {
Z z1 = new Z();
Z<B> z2 = new Z<B>();
Z<C> z3 = new Z<C>();
Z<D> z4 = new Z<D>();
Z<A> z5 = new Z<A>(); //compile error - E can be subsituted only until B
Z<? extends A> z5 = null; //no compile error
}
}
为什么这不会引发编译错误?
Z<? extends A> z5 = null;
Z 类在 B 之前有一个上限,但我可以有一个通配符声明一直延伸到 A。当然我不能将它实例化为
Z<? extends A> z5 = new Z<A>(); //Not allowed
但这不应该是编译错误吗?为什么它允许这个声明?
编辑:更正了 z5 的实例化