有界通配符的Java泛型行为

有界通配符的Java泛型行为,java,generics,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&

我尝试了一些泛型,注意到了这一点

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
    }
}
类D扩展了C{} 类C扩展了B{} 类B扩展了{} A类{} 类Z{} 班级临时工{ 公共静态void main(字符串[]args){ Z z1=新的Z(); Z z2=新的Z(); Z z3=新的Z(); Z z4=新的Z(); Z z5=new Z();//编译错误-E只能替换到B
Z我认为看待您所问问题的一种方式是,Java是否允许您编写

Z<?> z;
Z;
更一般地说,Java应该允许任何泛型类型与无界通配符一起使用吗?如果你认为答案是“是”,我也这么认为,那么你已经得到了答案

Z<? extends A> z5 = new Z<A>(); //Not allowed
Z<?> z;