我正在尝试一些泛型并注意到这一点。
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的实例化
答案 0 :(得分:3)
我认为,如果Java允许您编写
,则可以通过一种方式查看您的问题Z<?> z;
更一般地说,Java应该允许任何泛型类型与无界通配符一起使用。如果您认为答案是肯定的,我确实认为,那么您就得到了答案。