8

我有一个Map其键是通用类型Key<T>的,值是类型的List<T>。如果键是 的实例Key<String>,则值必须是 a 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 回答