在泛型中将有界通配符转换为无界通配符是错误的(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<?>>
,原因与 Dog
是Animal
,List<Dog>
不是 List<Animal>
。这里,? extends T
与Dog
的作用相同,?
与Animal
的作用相同。
您需要在 Class
前面加上 ? extends
才能正确编译。
Set<? extends Class<?>> sku = sk;
考虑这个示例:
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<?>>
,原因与 Dog
是Animal
,List<Dog>
不是 List<Animal>
。这里,? extends T
与Dog
的作用相同,?
与Animal
的作用相同。
您需要在 Class
前面加上 ? extends
才能正确编译。
Set<? extends Class<?>> sku = sk;