当前位置: 首页 > 面试题库 >

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

范高刚
2023-03-14
问题内容

我在寻找什么:

我正在寻找一种可以在地图的键和值上强制类型的东西:有点像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<?>> ,只是断言在运行时Key和Value是相同的类型。但是,我想知道是否可以严格使用泛型。


问题答案:

您可以执行此操作,但必须在上滚动自己的包装器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



 类似资料:
  • 问题内容: 我对此进行了扩展,应该可以帮助我在上下文之间传输对象: 现在它返回的对象,我应该将其强制转换为我想要的类,如下所示: 有没有办法避免这种无用的转换,如果我从类的对象调用使其返回类型? 问题答案: 更新: 有关更好的解决方案 与如何在NSManagedObjectSwift扩展中如何创建托管对象子类的实例中类似,这可以使用通用的辅助方法来完成: 请注意,我已将返回类型更改为。 并 没有

  • 我在Kotlin中有一个方法,它返回一个泛型列表的Rx可观察值: 因为Kotlin list特征定义为,Java将看到返回类型为。 是否有一种方法告诉Kotlin编译器,Java应该将其视为?

  • 背景:对于我的用户,我需要存储一对相同的对象类型(设置),目前我有它像 我正在创建带有设置的KeyValueTypes,并将其添加到列表中(每个用户都有一个列表)。我的设置有一个值字段(它显示了它们是否比其他设置“更重要”),所以我希望基于该字段添加它们,稍后我还需要基于该字段(可能还需要基于名称字段)进行搜索--所以搜索将不得不在列表中查找,然后在KeyValueTypes中查找 问题:什么是最

  • 问题内容: 我不明白为什么在尝试执行以下操作时会收到警告(未经检查的演员表): 我的意思是将castedMap发布到外部代码的危险是什么?两种操作均可在运行时完美运行: 使用SomeType类型的键从castedMap获取元素 使用SomeType类型的键将元素放入castedMap中。 我只是使用@SuppressWarnings(“ unchecked”)取消警告。 问题答案: 答案可能很无聊

  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口

  • 我读了很多文章,但我不明白这两行之间的区别: 我看到的唯一区别是第一行触发了“未检查的分配”警告。