3

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

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

4

1 回答 1

3

我认为查看您所要求的一种方式是,Java 是否允许您编写

Z<?> z;

更一般地说,Java 是否应该允许任何泛型类型与无界通配符一起使用。如果您认为答案是“是”,而我确实这么认为,那么您已经得到了答案。

于 2013-06-03T08:08:32.183 回答