有人可以解释一下,为什么这个演员阵容未经检查。应该保证T
类型总是来自Base
,因此不应取消选中T
到Base
的广告。
abstract class Base
{
private static final Map<Class<? extends Base>, Consumer<Base>> _CONSUMERS = new HashMap<>();
@SuppressWarnings( "unchecked" )
public static <T extends Base> void addConsumer( Class<T> clazz, Consumer<T> consumer )
{
_CONSUMERS.put( clazz, (Consumer<Base>) consumer );
}
}
答案 0 :(得分:1)
consumer
的类型为Consumer<T>
= Consumer<? extends Base>
,而put
需要Consumer<Base>
。
您可能应该声明_CONSUMERS
地图的类型:
Map<Class<? extends Base>, Consumer<? extends Base>>
Java无法识别可以使用X<? extends T>
(或X<? super T>
)类型的对象代替X<T>
的情况,您必须明确指出类型边界(请参阅{{3}关于这个的更全面的讨论。)