鉴于此代码:
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<?> 到 Class<T> 的未经检查的强制转换警告,因为 Object.getClass() 返回一个通配符类。
但是,key.getClass().getComponentType() 是否有可能不会返回 Class<T> 因为 T 是由 key 类的组件类型定义的?