2012-07-16 8 views
8

Mapのキーの総称タイプはKey<T>であり、値はList<T>です。キーがKey<String>のインスタンスの場合、値はList<String>でなければならず、同じルールが他のキーと値のペアに適用されます。私は、次のことを試してみましたが、それはコンパイルされません:私はこれは悪いですが、私は現在、より良い選択を持っていない知っている変数ジェネリックで地図を宣言するにはどうすればいいですか?

Map<Object, List> map; 

:現時点では

Map<T, List<T>> map; 

が、私は「部分的」ジェネリックでそれを宣言する必要が。このような状況でジェネリック医薬品を使用することは可能ですか?

UPDATE

多分私は明らかに私の問題を発現しませんでした。 、

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

をジェネリック型は、任意のものとすることができる一方で、キーと値が常に同じジェネリック型を持っている必要があります。

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

し、次のコードにコンパイルべきではない:私はすることができますマップが欲しいです明らかにマップを拡張しても私の要求は満たされません。

+0

スペースは問題ではありません。それはおそらくそれが使用される方法です。 OPは修正するためにもっとコードを表示する必要があります。 – Nishant

+0

タイプ「T」のキー、またはタイプ「Key 」のキーを使用していますか? –

+0

あなたの実際のシナリオでは、NishantとGeoffの答えにカプセル化を使用して問題を解決し、実際のコードに適応させるだけです。 –

答えて

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 > map'を別のクラスにラッピングしています。シンプルな地図が私の要求を満たすことができないと思われるので、これが最後の選択かもしれません。ありがとうございました! –

4

これは、あなたが望むものである:

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

あなたはスーパークラスとしてHashMapをしたくない場合は、あなたがしたい具体的なものは何でもクラスに変更します。

+0

私の更新を見てください。 –

+0

私は自分の答えを変えました。 – Brad

+0

しかし、データを格納するために 'Test'インスタンスを1つだけ使用するにはどうすればよいですか? –

関連する問題