Java 如何使用变量泛型声明映射?

Java 如何使用变量泛型声明映射?,java,generics,map,Java,Generics,Map,我有一个映射,它的键是泛型键,值是类型列表。如果键是键的实例,则该值必须是列表,并且相同的规则适用于任何其他键-值对。我尝试了以下方法,但无法编译: Map<T, List<T>> map; map.put(new Key<String>(), new ArrayList<Integer>()); Map; 目前,我必须用“部分”泛型来声明它: Map<Object, List> map; Map; 我知道这很糟糕,但我目前没

我有一个
映射
,它的键是泛型
,值是类型
列表
。如果键是
的实例,则该值必须是
列表
,并且相同的规则适用于任何其他键-值对。我尝试了以下方法,但无法编译:

Map<T, List<T>> map;
map.put(new Key<String>(), new ArrayList<Integer>());
Map;
目前,我必须用“部分”泛型来声明它:

Map<Object, List> map;
Map;
我知道这很糟糕,但我目前没有更好的选择。在这种情况下可以使用泛型吗

更新

也许我没有清楚地表达我的问题。我想要一张能够:

map.put(new Key<String>(), new ArrayList<String>());
map.put(new Key<Integer>(), new ArrayList<Integer>());
map.put(newkey(),newarraylist());
put(newkey(),newarraylist());
不应编译以下代码:

Map<T, List<T>> map;
map.put(new Key<String>(), new ArrayList<Integer>());
map.put(newkey(),newarraylist());
键和值应始终具有相同的泛型类型,而泛型类型可以是任意类型,显然扩展映射不符合我的要求。

这就是您想要的:

public class Test<T> extends HashMap<T, List<T>>
{
}
公共类测试扩展了HashMap
{
}

如果您不希望HashMap作为超类,那么将其更改为您想要的任何具体类

我不知道有任何现有的库可以做到这一点,但自己实现也不太困难。过去我做过几次类似的事情。不能使用标准映射接口,但可以在内部使用哈希映射来实现类。首先,它可能看起来像这样:

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>());
  }
}
公共类密钥映射{
公共静态类密钥{}
私有最终HashMap>();
公开作废(k项,清单五){
(k,v);
}
公共列表获取(键k){
返回(列表)值。获取(k);
}
公共静态void main(字符串[]args){
KeyMap a=新的KeyMap();
a、 put(newkey(),newarraylist());
a、 获取(新密钥());
}
}

空间不应该是问题所在。这可能是它的使用方式。OP需要显示更多要修复的代码。您使用的是
T
类型的键,还是
Key
类型的键?在您的实际场景中,您应该使用封装来解决问题,正如Nishant和Geoff在其答案中所述,只需根据您的实际代码进行调整。封装在这里不起作用,因为我只有一个映射。我不想声明
Test
Test
等等。但是我怎么能只使用一个
Test
实例来存储我的数据呢?我不完全清楚你的意思。能否再次展开您的问题?键及其关联值应始终具有相同的泛型类型,例如
键-->列表
键-->列表
。使用您的解决方案,如果我声明一个
测试
,那么我将无法将
键-->列表
放入其中。如果这是您试图创建的系统,您将如何从中获得正确键入的值?我想可以使用类似于强制转换的
列表=(List)map.get(new Key())
,但在此之前,我必须首先能够声明这样一个映射。实际上,您正在将我的
映射
包装到另一个类中。似乎一张简单的地图不能满足我的要求,所以这可能是最后的选择。非常感谢。