【发布时间】:2009-09-24 18:39:34
【问题描述】:
我处于一种情况,我想要一个映射,其中键是接口类,对应的值是实现该接口的类。换句话说,键和值类型是相关的。
添加到地图并获取实现类实例的方法的当前实现如下所示:
// should be something like Class<T>, Class<? extends T>
static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>> ();
public static <T> void add(Class<T> interfaceT,
Class<? extends T> implementationT) {
map.put(interfaceT, implementationT);
}
public static <T> T get(Class<T> interfaceT) {
// cast caused by definition not complete.
Class<T> implementationT = (Class<T>) map.get(interfaceT);
// try catch stuff omitted
T t = implementationT.newInstance();
return t;
}
我的问题是:
可以我定义“map”变量,这样就不需要在 get(...) 方法中进行强制转换了吗?我无法使“新的HashMap<Class<T>, Class<? extends T>>()”工作,所以要么是不可能的,要么我错过了一些基本的东西:)
请指教:)
编辑:原来 Class 上的 asSubclass() 方法做了我想要的:D
Class<?> rawClassFromMap = map.get(interfaceT);
Class<? extends T> implementationT = rawClassFromMap.asSubclass(interfaceT);
implementationT 是 "? extends T" 类型很好,因为我只需要返回一个 T 对象。
我喜欢泛型。让我想起了 Haskell...
【问题讨论】: