我在寻找什么:
我正在构建一些在地图的键和值上强制执行类型的东西:有点像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。但是,看看这个
key不再是一个恒定的时间操作。
我知道我可以做Map<Key<?>, Value<?>>
之类的事情
并且断言Key和Value在运行时是相同的类型。
但是,我想知道这是否可以严格使用泛型。
答案 0 :(得分:21)
你可以这样做,但你必须在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
。
答案 1 :(得分:0)
使用 GenericMap 自定义类 以及另一个 generic 类 GenericKey 作为密钥,您可以在此答案中看到完整的示例