与通配符的通用地图

时间:2015-12-02 15:59:01

标签: java generics dictionary

我需要为某些类存储一个对象实例。 我想创建一个这样的通用地图:

<T> Map<Class<T>, T> objects;

但它不可能和

Map<Class<?>, ?> objects;

不是我想要的,因为我想避免演员:

MyClass c = (MyClass)objects.get(MyClass.class);

另外,我希望Java禁止我这样做:

objects.put(MyClass.class, new MyClass2());

一种解决方案是创建一个自定义地图,这样我就会有一个通用参数<T>,但有没有创建新类的解决方案?

2 个答案:

答案 0 :(得分:3)

标准Map接口不适合此类情况。但是,您可以实现自己的类,该类将getput方法参数化,并将其委派给私有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());