2011-11-18 7 views
8

私のクラスの1つはスーパークラスに従ってクラスを格納する必要があります。その目的のために、私は、キーがスーパークラスであるHashMapを使用しており、その拡張クラスのリストを評価しています。だから、そのようになっていますHashMap <Class<?>、リスト<Class<?> >>リストのクラスがキーを拡張するよう指定します

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

私は、私はより正確にできるように表記があったかどうかを知るために何かたい:私はそれを試してみました、もちろんしまし

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

を、それは動作しません:Tを解決することはできません。それを可能にする構文がありますか?あなたの助けを前にありがとう。

答えて

8

アクセサーメソッドを使用してこれを行うことができます。

// 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>> { 

} 

は完全にあなたの問題を解決することはできません。マップ内の単一のエントリでは変化しないことがわかります。

関連する問題