我不太确定如何表达我的问题,所以我要举个例子:
以此地图为例:
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>
有一个简单的解决方案吗?
答案 0 :(得分:3)
正如@zaske已经在his answer中指出的那样,这似乎不可能。
根据您已经考虑过的内容,您可以将Map
包含在一个类中,该类提供您想要的通用get
和put
方法。
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)。