地图中的动态模板依赖关系

时间:2012-12-07 12:55:44

标签: java templates generics map type-safety

我不太确定如何表达我的问题,所以我要举个例子:

以此地图为例:

Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;

它映射了MyClass,将DatabaseEntry扩展到IDecorator<MyClass>。 上述陈述的问题在于,它太不明确了。我想要更多类型安全。 像这样:

Map<Class<T extends DatabaseEntry>, Class<? extends IDecorator<T>>> map;

当然,T会因入境而异,但我想要的是如果我打电话:

map.get(MyClass.class);

返回类型为IDecorator<MyClass>而不是IDecorator<? extends DatabaseEntry>

有一个简单的解决方案吗?

2 个答案:

答案 0 :(得分:3)

正如@zaske已经在his answer中指出的那样,这似乎不可能。

根据您已经考虑过的内容,您可以将Map包含在一个类中,该类提供您想要的通用getput方法。

public class MapWrapper { 

    Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;
    public <T extends DatabaseEntry> Class<IDecorator<T>> put (Class<T> k, Class<IDecorator<T>> v){
        return (Class<IDecorator<T>>) map.put(k,v);
    }

    public <T extends DatabaseEntry> Class<IDecorator<T>> getObject(Class<T> k) {
        return (Class<IDecorator<T>>) map.get(k);
    }
}

答案 1 :(得分:2)

据我所知 - 无法做到这一点。
你当然不能使用T,T必须是通用定义的一部分,
并且不能在这样的变量的独立定义中,这就是你 有通配符(?)。
由于您的地图正在考虑班级的关键和价值对象 你甚至无法通过简单地扩展键和值的类型来解决这个问题(因为Class是final)。