由'B <T>扩展A <T>'定义,Class <T>变量似乎是互变的

时间:2019-12-06 11:43:59

标签: java generics

两个类型参数为T的类:

class A<T>{}  
class B<T> extends A<T>{}

类型A和B分别是不变的,并且A可以从B分配相同的通用类型。

A<String> a = new B<String>();

对于可从A.class和B.clas分配的类变量,不允许使用协方差。这似乎是反变的。类的泛型规则不同吗?

Class<? extends A<?>> clz1 = A.class; // error with a type mismatch
Class<? extends A<?>> clz2 = B.class; // error with a type mismatch

Class<A> clz3 = A.class; // ok with a raw type warning
Class<B> clz4 = B.class; // ok with a raw type warning

Class<? super B<?>> clz5 = A.class; // ok
Class<? super B<?>> clz6 = B.class; // ok

1 个答案:

答案 0 :(得分:0)

第一个示例与协方差无关,而是A.class类型为Class<A>(原始类型A)和Class<? extends A<?>>期望{ {1}}。更改为:

A

使其编译。

第三个示例由于类型擦除而编译。可以将Class<? extends A> clz1 = A.class; // ok with warning 分配给B<?>,因为类型参数将在分配中被删除。