有界通配符的Java泛型行为

时间:2013-06-03 07:57:57

标签: java generics

我正在尝试一些泛型并注意到这一点。

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的实例化

1 个答案:

答案 0 :(得分:3)

我认为,如果Java允许您编写

,则可以通过一种方式查看您的问题
Z<?> z;

更一般地说,Java应该允许任何泛型类型与无界通配符一起使用。如果您认为答案是肯定的,我确实认为,那么您就得到了答案。

相关问题