有趣的未经检查的投射警告

时间:2017-04-21 20:07:25

标签: java generics casting unchecked-cast

鉴于此代码:

public final class MyMap extends HashMap<MyClass<? extends MyInterface>, MyInterface>
{
    public <T extends MyInterface> T put(MyClass<T> key, T value)
    {
        return (T)key.getClass().getComponentType().cast(super.put(key, value));
    }
}

我从MyInterface到T获得了一个未经检查的强制转换警告。

我真的不喜欢它,所以我使用Class.cast()方法来代替它。 现在我的新功能看起来像这样:

public final class MyMap extends HashMap<MyClass<? extends MyInterface>, MyInterface>
{
    public <T extends MyInterface> T put(MyClass<T> key, T value)
    {
        Class<T> cl = (Class<T>)key.getClass().getComponentType();
        return cl.cast(super.put(key, value));
    }
}

但是这个给出了来自Class&lt;?&gt;的未经检查的强制警告。类&lt; T&gt; as Object.getClass()返回通配符类。

但是,key.getClass()。getComponentType()是否有可能不返回Class&lt; T&gt;因为T是由密钥类的组件类型定义的吗?

0 个答案:

没有答案