如何申报可变泛型地图吗?(How to declare a map with variable ge

2019-06-26 07:30发布

我有一个Map ,它的键是通用型的Key<T>和值类型List<T> 如果密钥的实例Key<String> ,其值必须是一个List<String> ,同样的规则也适用于其他任何键-值对。 我曾尝试以下,但它不会编译:

Map<T, List<T>> map;

目前我有“部分”仿制药申报吧:

Map<Object, List> map;

我知道这是不好的,但我目前还没有更好的选择。 是否有可能使用泛型在这种情况呢?

UPDATE

也许我没有表达清楚我的问题。 我希望有一个地图,它能够:

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

而下面的代码不应该编译:

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

键和值应该总是有相同的泛型类型,而泛型类型可以是任意的,而且显然延伸的地图不符合我的要求。

Answer 1:

我不知道,正是这是否任何现有的库,但它是不是太难实现自己。 我已经做了,在过去类似的几次东西。 您不能使用标准地图界面,但你可以使用一个内部哈希表来实现你的类。 首先,它可能是这个样子:

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>());
  }
}


Answer 2:

这是你想要什么:

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

如果你不希望一个HashMap作为超类,然后将其更改为你想要的任何具体类。



文章来源: How to declare a map with variable generics?