Java 泛型对映射的键和值强制实施相同的类型

2022-09-02 01:32:17

我正在寻找:

我希望构造一些东西,在映射的键和值上强制执行类型:有点像.但是,我还想强制在每个键/值条目强制类型匹配,但在条目之间,不应强制执行任何类型。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>

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


答案 1

你可以这样做,但你必须在: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


答案 2

使用 GenericMap 自定义类和另一个泛型GenericKey 作为键,您可以在此答案中看到完整的示例

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


推荐