java:如何修复未选中的强制转换警告

我有以下代码:

private HashMap<Class, HashMap> m_componentStores; public  T getComponent(Entity e, Class exampleClass) { HashMap store = m_componentStores.get(exampleClass); T result = (T)store.get(e); if (result == null) { throw new IllegalArgumentException( "GET FAIL: "+e+" does not possess Component of class\nmissing: "+exampleClass ); } return result; } 

当我编译时,它显示T result = (T)store.get(e)有一个未经检查的强制转换。

 Type safety: Unchecked cast from capture#2-of ? extends Component to T 

为了防止出现此警告,我错过了什么?

Class.cast就是你想要的。 好吧,你可能会考虑不使用reflection。

换行:

 T result = (T)store.get(e); 

至:

 T result = exampleClass.cast(store.get(e)); 

在Cast语句上方写@SuppressWarnings("unchecked")

 @SuppressWarnings("unchecked") T result = (T)store.get(e); 

并添加一个解释性声明,为什么忽略警告是安全的。

generics中的extends并不真正以这种方式工作。 T != ? extends Component 即使T extends ComponentT extends Component 。 你所拥有的实际上是一个通配符捕获 ,它有不同的用途。

是的,你的解决方案不是类型安全的 – 两者之间没有关系? 标记在:

  private HashMap, HashMap> m_componentStores; 

因此,使用其他类(甚至不是Component的子类)作为键,在此结构中放置Component的某个子类的实例变得合法。

请记住,generics类型仅在编译时解析,因此在运行时 m_componentStores无法知道您在那里的值的确切类型,除了它extends Component

所以你从store.get(e)得到的类型是…… Component

  Component result = store.get(e); 

ComponentT ,编译器会发出警告,因为无法静态检查强制转换。 但是,如果您确定数据结构的语义,则可以简单地抑制警告。

  @SuppressWarnings("unchecked") T resultT = (T)result; 

PS:您不需要通配符捕获,以下内容在您的情况下将完全相同:

  private HashMap, HashMap> m_componentStores;