[英]Dynamic template dependency in a map
我不太确定如何表达我的问题,所以我举一个例子:
以这张地图为例:
Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;
例如,它将将DatabaseEntry
扩展到其IDecorator<MyClass>
MyClass
映射。 上述声明的问题在于,它过于明确。 我想要更多的类型安全性。 像这样:
Map<Class<T extends DatabaseEntry>, Class<? extends IDecorator<T>>> map;
当然,T随条目的不同而不同,但是我想要的是如果我打电话给我:
map.get(MyClass.class);
返回类型将是IDecorator<MyClass>
而不是IDecorator<? extends DatabaseEntry>
IDecorator<? extends DatabaseEntry>
有一个简单的解决方案吗?
正如@zaske在他的回答中已经指出的那样,这似乎是不可能的。
按照您已经在考虑的思路,您可以将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);
}
}
据我所知-没有办法做到这一点。
您当然不能使用T,T必须是通用定义的一部分,
并且不能在这样的变量的独立定义中使用,这就是通配符(?)的目的。
由于您的地图正在使用Class的键和值对象
您甚至不能通过简单地扩展键和值的类型来解决此问题(因为Class是最终的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.