最后,我确实采用了以下解决方案。非常感谢Radiodef,他告诉我使用类型安全的异构容器。
private Map<Class<?>, SomeImpl<?>> map = new HashMap<>();
具体实现方法如下:
public <T extends BaseClass> void addImpl(SomeImpl<T> loader, Class<T> aClass) {
map.put(type, loader);
}
public <T extends BaseClass> SomeImpl<T> getImpl(Class<T> aClass) {
return (SomeImpl<T>) map.get(type);
}
最初,我也在寻找一个可以用
BaseClass
. 我发现这是不可能的,所以下面的技巧:
public SomeImpl<BaseClass> getBaseImpl(Class<? extends BaseClass> aClass) {
return (BaseLoader<BaseClass>) map.get(type);
}
这确实是一个未保存的转换,因为编译器无法确保
基类
通过了。但是,我可以确保始终传递正确的类型(或者强制使用
isAssignableFrom
).
这让我可以装一些
基类
对象,来自数据库,例如:
List<BaseClass> list = getSomeBaseClasses();
Map<Class<? extends BaseClass>, List<BaseClass> map = list.stream()
.collect(Collectors.groupingBy(BaseClass::getClass));
map.forEach((aClass, bases) -> {
SomeImpl<BaseClass> impl = getBaseImpl(aClass);
impls.forEach(impl::execute);
}