[英]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.