8

Mapキーがジェネリック型Key<T>で、値が型であるaがありますList<T>。キーがのインスタンスである場合Key<String>、値はである必要がList<String>あり、同じルールが他のキーと値のペアに適用されます。私は以下を試しましたが、コンパイルされません:

Map<T, List<T>> map;

現在、私はそれを「部分的な」ジェネリックで宣言する必要があります。

Map<Object, List> map;

私はこれが悪いことを知っていますが、私は現在これ以上の選択肢はありません。この状況でジェネリックを使用することは可能ですか?

アップデート

たぶん私は自分の問題を明確に表現していませんでした。次のことができるマップが必要です。

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

そして、次のコードはコンパイルしないでください:

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

キーと値は常に同じジェネリック型である必要がありますが、ジェネリック型は任意であり、マップを拡張することは明らかに私の要件を満たしていません。

4

2 に答える 2

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>());
  }
}
于 2012-07-16T05:16:31.003 に答える
4

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

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

スーパークラスとしてHashMapが必要ない場合は、必要な具象クラスに変更してください。

于 2012-07-16T04:33:28.047 に答える