2012-06-13 123 views
1

我是泛型的新手。Java泛型:聲明泛型類型的映射值

有一個Map

private static Map<String, Object> map; 

和像

public <T> T getObject(final Class<T> myClass) { 
    return (T)map.get(myClass); 
} 

的方法如何改變,以地圖的聲明從方法返回時沒有做演員?

+0

你有沒有機會宣佈地圖像'Map >'? – nobeh

+0

@nobeh IDE說:T無法解析爲類型 –

+0

我認爲@Pablo對此有一個很好的答案。 – nobeh

回答

8

你需要做一個通用類,而不是一個通用的方法:

public class MyClass<T> { 
    private Map<String, T> map; 

    public T getObject(final String key) { 
    return map.get(key); 
    } 
} 

另外,我將參數從一個類更改爲一個字符串。如果map.get()需要一個String,那麼傳遞一個Class沒有任何意義。

編輯:我沒有注意到地圖是靜態的。如果您可以將其更改爲非靜態而不破壞程序的其他部分,則可以使用此功能。如果你不能,那麼你無法避免演員陣容。

+0

無法對非靜態類型T做出靜態引用T –

+0

@DisplayName OK,map是靜態的,我錯過了。然後,如果您無法將地圖從靜態更改爲非靜態,則這不起作用。 – Pablo

0

你無法迴避的轉換操作爲get()方法返回Object 看到here更多信息

+1

除非你可以以某種方式聲明該地圖爲類型爲的地圖,它似乎不適合你的示例 – Miquel

+0

@Miquel即使這樣也不會改變問題,get()方法返回一個對象,而不是T – Grimmy

+0

@Miquel我嘗試過,但不起作用。你能告訴我爲什麼嗎? –

0

如果你願意放棄你的地圖的static修改,比你能做到像這樣:

public class MyClass<T> { 

    private Map<String, T> map; 

    public T getObject(final Class<T> myClass) { 
     return map.get(myClass); 
    } 
} 

否則:

這是一個編譯時錯誤指一個通用的 類C的一個類型參數中的任何位置:

  • 的ç
  • 01的靜態成員的聲明

(摘自JLS),其阻止您使用參數化類實現上述。

什麼試圖做,但是,從另一個成員(這恰好也是靜態的),這也可達指一個參數方法的類型參數。