在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); } }
也就是说,我可以针对Class对象存储任何默认值,只要该值的类型与Class对象的类型匹配即可。我不明白为什么不应该这样做,因为我可以确保在设置/获取值时类型正确。
编辑:感谢克莱特斯的回答。我实际上不需要映射本身上的类型参数,因为我可以确保获取/设置值的方法的一致性,即使这意味着使用一些稍微难看的强制转换也是如此。
你不是要实现Joshua Bloch的类型安全的异构容器模式吗?基本上:
public class Favorites { private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); public <T> void setFavorite(Class<T> klass, T thing) { favorites.put(klass, thing); } public <T> T getFavorite(Class<T> klass) { return klass.cast(favorites.get(klass)); } public static void main(String[] args) { Favorites f = new Favorites(); f.setFavorite(String.class, "Java"); f.setFavorite(Integer.class, 0xcafebabe); String s = f.getFavorite(String.class); int i = f.getFavorite(Integer.class); } }