[英]java: How to fix the Unchecked cast warning
我有以下代码:
private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;
public <T extends Component> T getComponent(Entity e, Class<T> exampleClass)
{
HashMap<Entity, ? extends Component> 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
是您想要的。 好吧,您可能会考虑不使用反射。
更改行:
T result = (T)store.get(e);
至:
T result = exampleClass.cast(store.get(e));
在Cast语句上方编写@SuppressWarnings("unchecked")
:
@SuppressWarnings("unchecked")
T result = (T)store.get(e);
并添加解释性说明,为什么可以安全地忽略该警告。
在泛型中extends
不是真的那样。 T
!= ? extends Component
? extends Component
即使T extends Component
。 实际上,您拥有的是通配符捕获 ,它具有不同的用途。
是的,您的解决方案不是类型安全的-两者之间没有关系?
标记在:
private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;
因此,使用其他某个类(甚至不是Component
的子类)作为键,将Component
的某个子类的实例放入此结构是合法的。
请记住,泛型类型仅在编译时才能解析,因此在运行时, m_componentStores
除了extends
Component
之外,无法知道其中的值的确切类型。
因此,您从store.get(e)
获得的类型是... Component
:
Component result = store.get(e);
将Component
为T
,编译器将发出警告,因为无法静态检查强制转换。 但是,如果您确定数据结构的语义,则可以简单地取消警告。
@SuppressWarnings("unchecked")
T resultT = (T)result;
PS:您不需要通配符捕获,以下情况在您的情况下将完全相同:
private HashMap<Class<?>, HashMap<Entity, Component>> m_componentStores;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.