22

我在找什么:

我正在寻找构建一些在地图的键和值上强制类型的东西:有点像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 接受相同类型的键/值。但是,按键查找将不再是一个恒定时间操作。

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

4

2 回答 2

26

你可以这样做,但你必须在 a 上滚动你自己的包装器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

于 2013-08-09T22:50:49.117 回答
0

使用GenericMap自定义类和另一个通用GenericKey作为键,你可以在这个答案中看到完整的例子

值受键的类型参数限制的 Java 映射

于 2020-11-05T12:34:33.123 回答