2012-07-16 33 views
8

我有一個Map其鍵的通用類型Key<T>,值是List<T>類型。如果密鑰是Key<String>的實例,則該值必須是List<String>,並且相同的規則適用於任何其他鍵值對。我曾嘗試以下,但它並不能編譯:如何聲明具有變量泛型的地圖?

Map<T, List<T>> map; 

目前我有「部分」仿製藥申報它:

Map<Object, List> map; 

我知道這是不好的,但我目前還沒有更好的選擇。在這種情況下是否可以使用泛型?

UPDATE

也許是我沒有表達清楚我的問題。我希望有一個地圖,它能夠:

map.put(new Key<String>(), new ArrayList<String>()); 
map.put(new Key<Integer>(), new ArrayList<Integer>()); 

而下面的代碼不應該編譯:

map.put(new Key<String>(), new ArrayList<Integer>()); 

的關鍵和值應始終具有相同的泛型類型,而泛型類型可以是任意的,顯然擴展地圖不符合我的要求。

+0

空間不應該是問題。這可能是它被使用的方式。 OP需要顯示更多的代碼來修復。 – Nishant 2012-07-16 04:33:53

+0

您正在使用'T'類型的鑰匙還是'鑰匙'類型的鑰匙? – 2012-07-16 04:34:18

+0

根據你的實際情況,你應該使用封裝來解決你的問題,因爲Nishant和Geoff在他們的答案中聲明,只是適應你的實際代碼。 – 2012-07-16 04:43:26

回答

7

我不知道有任何現有的庫可以做到這一點,但它不是很難實現自己。過去我曾經做過幾次類似的事情。你不能使用標準的Map接口,但你可以使用裏面的哈希映射來實現你的類。首先,它可能看起來像這樣:

public class KeyMap { 
    public static class Key<T> { } 

    private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>(); 

    public <T> void put(Key<T> k, List<T> v) { 
    values.put(k, v); 
    } 

    public <T> List<T> get(Key<T> k) { 
    return (List<T>)values.get(k); 
    } 

    public static void main(String[] args) { 
    KeyMap a = new KeyMap(); 
    a.put(new Key<String>(), new ArrayList<String>()); 
    a.get(new Key<Integer>()); 
    } 
} 
+0

你實際上是在將我的'Map >地圖'封裝到另一個類中。似乎簡單的地圖不能滿足我的要求,所以這可能是最後的選擇。謝謝! – 2012-07-16 05:58:59

4

這是你想要什麼:

public class Test<T> extends HashMap<T, List<T>> 
{ 
} 

如果你不想一個HashMap作爲超類,然後將其更改爲你想要的任何具體類。

+0

請看我的更新。 – 2012-07-16 04:43:03

+0

我改變了我的答案。 – Brad 2012-07-16 04:47:41

+0

但是我怎麼能只用一個'Test'實例來存儲我的數據呢? – 2012-07-16 04:56:14