簡體   English   中英

java:如何修復Unchecked轉換警告

[英]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);

ComponentT ,編譯器將發出警告,因為無法靜態檢查強制轉換。 但是,如果您確定數據結構的語義,則可以簡單地取消警告。

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

PS:您不需要通配符捕獲,以下情況在您的情況下將完全相同:

    private HashMap<Class<?>, HashMap<Entity, Component>> m_componentStores;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM