Java泛型行为:有界通配符

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的实例化。
1个回答

3
我认为你所询问的问题可以这样理解:Java是否应该允许你编写

内的HTML代码。
Z<?> z;

更普遍地说,Java是否应允许任何泛型类型与无界通配符一起使用。如果你认为答案是“是”,我也这样认为,那么你已经得到了你的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接