Java泛型对映射的键和值强制使用相同的类型

Java泛型对映射的键和值强制使用相同的类型,java,generics,map,Java,Generics,Map,我在寻找什么: 我想构造一种对映射的键和值都强制类型的东西:有点像map。但是,我还想强制每个键/值条目内的类型匹配,但在条目之间,不应强制任何类型 例如,在同一映射中,这些键/值对应被视为有效: 键映射到值 键映射到值 键映射到值 但是,类似的内容是无效的: 键映射到值 键映射到值 如何使用Java泛型实现这一点 我不想找的东西: 我知道我可以实现类似Set,其中 pair接受相同类型的键/值。然而,通过 键将不再是恒定时间操作 我知道我可以做一些像Map> 只需在运行时断言键和值

我在寻找什么:

我想构造一种对映射的键和值都强制类型的东西:有点像
map
。但是,我还想强制每个键/值条目内的类型匹配,但在条目之间,不应强制任何类型

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

  • 映射到
  • 映射到
  • 映射到
但是,类似的内容是无效的:

  • 映射到
  • 映射到
如何使用Java泛型实现这一点


我不想找的东西:

  • 我知道我可以实现类似
    Set
    ,其中 pair接受相同类型的键/值。然而,通过 键将不再是恒定时间操作

  • 我知道我可以做一些像
    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
        }
      }
      
      类MyTypeSafeMap{
      私有地图>地图;
      公共作废put(键、值){
      map.put(键、值);
      }
      公共值获取(密钥){
      返回(值)映射。获取(键);
      //我们知道它是安全的,但编译器无法证明它
      }
      }
      
      比较例如番石榴。

      使用通用地图定制类 另一个泛型类GenericKey对于键,您可以在这个答案中看到完整的示例


      您不是在泛型类中拥有该映射吗?不一定。只是想在任何地方创建一个
      映射
      ,该映射只强制“键必须与值的类型相同(或者在
      /
      的情况下,键内具有相同的泛型类型),但每个键/值对可以是不同的类型。”这正是您搜索的内容:将返回值转换为(value)或(value)有什么区别吗?