Java泛型对map的键和值强制执行相同的类型

时间:2013-08-09 22:46:46

标签: java generics map

我在寻找什么:

我正在构建一些在地图的键和值上强制执行类型的东西:有点像Map<Key<X>, Value<X>>。但是,我还想强制在每个键/值条目中匹配,但在条目之间,不得强制执行任何类型。

例如,在同一个地图中,这些键/值对应被视为有效:

  • Key<Integer>映射到Value<Integer>
  • Key<String>映射到Value<String>
  • Key<Double>映射到Value<Double>

然而,这样的事情将是无效的:

  • Key<Integer>映射到Value<String>
  • Key<Double>映射到Value<Boolean>

如何使用Java泛型完成此操作?


我不想要的东西:

  • 我知道我可以实现Set<Pair>之类的内容 pair接受相同类型的Key / Value。但是,看看这个 key不再是一个恒定的时间操作。

  • 我知道我可以做Map<Key<?>, Value<?>>之类的事情 并且断言Key和Value在运行时是相同的类型。 但是,我想知道这是否可以严格使用泛型。

2 个答案:

答案 0 :(得分:21)

你可以这样做,但你必须在Map之上滚动你自己的包装:

class MyTypeSafeMap {
  private Map<Key<?>, Value<?>> map;
  public <T> void put(Key<T> key, Value<T> value) {
    map.put(key, value); 
  }

  public <T> Value<T> get(Key<T> key) {
    return (Value) map.get(key); 
    // we know it's safe, but the compiler can't prove it
  }
}

比较例如番石榴的ClassToInstanceMap

答案 1 :(得分:0)

使用 GenericMap 自定义类 以及另一个 generic GenericKey 作为密钥,您可以在此答案中看到完整的示例

Java map with values limited by key's type parameter