在泛型中将有界通配符转换为无界通配符是错误的(X<Y<? extends T>> 到 X<Y<?>>

Casting bounded wildcard to unbounded wildcard within a generic type is an error (X<Y<? extends T>> to X<Y<?>>

考虑这个示例:

private <T> void m(Class<? extends T> k, Set<Class<? extends T>> sk) {
    Class<?> ku = k;
    Set<Class<?>> sku = sk; // <-- Type mismatch: cannot convert from
                            //     Set<Class<? extends T>> to Set<Class<?>>
}

换句话说,我可以将 Class<? extends T> 分配给 Class<?> 以获得任意 T,但不能将 Set<Class<? extends T>> 分配给 Set<Class<?>>

这可能与covariance/contravariance的某些限制有关,但是什么?

我可以介绍演员表:Class.class::cast 可以。但是有没有办法通过微妙的 type-fu 使编译器屈服于我的意志,而不是用强制转换来猛烈抨击它?

尽管 Class<? extends T>Class<?>,但 Set<Class<? extends T>> 不是 Set<Class<?>>,原因与 DogAnimalList<Dog> 不是 List<Animal>。这里,? extends TDog的作用相同,?Animal的作用相同。

您需要在 Class 前面加上 ? extends 才能正确编译。

Set<? extends Class<?>> sku = sk;