未经检查的强制转换抽象基类

时间:2017-03-30 09:49:04

标签: java casting abstract-class

有人可以解释一下,为什么这个演员阵容未经检查。应该保证T类型总是来自Base,因此不应取消选中TBase的广告。

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 );
    }
}

1 个答案:

答案 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}关于这个的更全面的讨论。)