2011-11-18 76 views
8

我的一個類需要根據它們的超類存儲類。爲此,我使用了一個HashMap,其中鍵是超類,並且爲它們的擴展類列出了一個值。因此,它看起來像這樣:HashMap <Class<?>,列表<Class<?> >>:指定列表的類擴展密鑰'

HashMap<Class<?>, List<Class<?>>> 

我想知道是否有一個記號讓我更準確地說,是這樣的:

HashMap<Class<T>, List<Class<? extends T>>> 

我已經試過了,當然,它不起作用:T無法解決。有沒有一種語法可以讓我做到這一點?在此先感謝您的幫助。

回答

8

你可以用accessor方法做到這一點。

// only accessed by methods which check the keys and values are the right type. 
final Map<Class, List<Class>> map = new LinkedHashMap<Class, List<Class>>(); 

public <T, S extends T> void add(Class<T> key, Class<S> value) { 
    List<Class> list = map.get(key); 
    if (list == null) 
     map.put(key, list = new ArrayList<Class>()); 
    list.add(value); 
} 

public <T, S extends T> List<Class<S>>get(Class<T> key) { 
    return (List<Class<S>>) map.get(key); 
} 

public <T, S extends T> boolean contains(Class<T> key, Class<S> value) { 
    List<Class> list = map.get(key); 
    if (list == null) return false; 
    return list.contains(value); 
} 

public static void main(String... args) { 
    Main m = new Main(); 
    m.add(Number.class, Integer.class); // compiles 
    m.add(Number.class, String.class); // does not compile. 
} 
+2

+1。但是請注意,m.add(Number.class,Number.class);也編譯。 –

+0

你是對的,在這種情況下,'extends'不一定是一個嚴格的子類。 –

+0

你會如何用這種做事的方式來編碼獲得者? – Raveline

1

喜歡的東西:

class MyMap<T extends Class<?>> extends HashMap<T, List<T>> { 

} 

不會完全解決你的問題。你可以看到在地圖上的單個條目中它不能改變。

相關問題