值受键的类型参数限制的泛型Java映射
Java中有没有一种方法可以将值的类型参数绑定到键的类型参数?我想写的内容如下:
public class Foo {
// This declaration won't compile - what should it be?
private static Map<Class<T>, T> defaultValues;
// These two methods are just fine
public static <T> void setDefaultValue(Class<T> clazz, T value) {
defaultValues.put(clazz, value);
}
public static <T> T getDefaultValue(Class<T> clazz) {
return defaultValues.get(clazz);
}
}
也就是说,只要值的类型与类对象的类型匹配,我就可以针对类对象存储任何默认值。我不明白为什么不允许这样做,因为我可以确保在设置/获取值时类型是正确的
编辑:谢谢克莱特斯的回答。我实际上不需要映射本身的类型参数,因为我可以确保获取/设置值的方法的一致性,即使这意味着使用一些稍微难看的强制转换
# 1 楼答案
您可以使用以下两个类,映射类:GenericMap,映射键类:GenericKey
例如:
优势
通用地图
通用密钥
# 2 楼答案
不,你不能直接做。您需要围绕
Map<Class, Object>
编写一个包装器类,以强制该对象为instanceof
类# 3 楼答案
可以创建一个类来存储类型为safe key的映射到值,并在必要时强制转换。强制转换
get
方法是安全的,因为在使用new Key<CharSequence>()
之后,不可能将其安全地强制转换为Key<String>
或Key<Object>
,因此类型系统强制正确使用类Key
类必须是final,否则,如果两个不同类型的元素相等,用户可能会重写equals
并导致类型不安全。或者,如果您想使用继承,尽管它存在问题,也可以将equals
重写为final# 4 楼答案
你不是在尝试实现Joshua Bloch的类型安全异构容器模式吧?基本上:
来自Effective Java (2nd edition)和this presentation
# 5 楼答案
这个问题和答案让我想到了这个解决方案:Type-safe object map。这是代码。测试用例:
这是重点课程。注意,类型
T
从未在这个类中使用过!这纯粹是为了在从映射中读取值时进行类型转换。字段key
只给出键的名称类型映射。爪哇:
# 6 楼答案
T
作为类型必须在类实例中进行常规定义。以下示例有效:或者,您可以使用paultomblin的答案,并用您自己的对象包装
Map
,这将强制执行这种类型的泛型