我需要为某些类存储一个对象实例。 我想创建一个这样的通用地图:
<T> Map<Class<T>, T> objects;
但它不可能和
Map<Class<?>, ?> objects;
不是我想要的,因为我想避免演员:
MyClass c = (MyClass)objects.get(MyClass.class);
另外,我希望Java禁止我这样做:
objects.put(MyClass.class, new MyClass2());
一种解决方案是创建一个自定义地图,这样我就会有一个通用参数<T>
,但有没有创建新类的解决方案?
答案 0 :(得分:3)
标准Map
接口不适合此类情况。但是,您可以实现自己的类,该类将get
和put
方法参数化,并将其委派给私有Map
字段:
public class ClassObjectMap {
private Map<Class<?>, Object> map = new HashMap<>();
public <T> void put(Class<T> clazz, T value) {
assert clazz.isInstance(value);
map.put(clazz, value);
}
public <T> T get(Class<T> clazz) {
return clazz.cast(map.get(clazz));
}
}
添加其他方法,例如remove()
或size()
也不是很难。
答案 1 :(得分:0)
如果可以,请不要直接使用地图,而是始终使用这些方法来访问地图。这样你就把铸件放到了方法中,而你却没有在其他任何地方看到它。
private Map<Class<?>, Object> map = new HashMap<Class<?>, Object>();
private <T> T getMapValue(Class<T> key){
return (T) map.get(key);
}
private <T> void putMapValue(Class<T> key, T value){
map.put(key, value);
}
而且它也禁止你做
putMapValue(MyClass.class, new MyClass2());