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 Component
也T extends Component
。 你所拥有的实际上是一个通配符捕获 ,它有不同的用途。
是的,你的解决方案不是类型安全的 – 两者之间没有关系?
标记在:
private HashMap, HashMap> m_componentStores;
因此,使用其他类(甚至不是Component
的子类)作为键,在此结构中放置Component
的某个子类的实例变得合法。
请记住,generics类型仅在编译时解析,因此在运行时 m_componentStores
无法知道您在那里的值的确切类型,除了它extends
Component
。
所以你从store.get(e)
得到的类型是…… Component
:
Component result = store.get(e);
将Component
为T
,编译器会发出警告,因为无法静态检查强制转换。 但是,如果您确定数据结构的语义,则可以简单地抑制警告。
@SuppressWarnings("unchecked") T resultT = (T)result;
PS:您不需要通配符捕获,以下内容在您的情况下将完全相同:
private HashMap, HashMap> m_componentStores;