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

Jon*_*uis 17 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.但是,按键查看这个不再是一个恒定的时间操作.

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

Lou*_*man 22

你可以这样做,但你必须在自己的上面滚动自己的包装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
  }
}
Run Code Online (Sandbox Code Playgroud)

比较例如番石榴ClassToInstanceMap.