我现在已经在嵌套泛型方面苦苦挣扎了一段时间。这就是我现在能做的事情:
基本上我有一些类型的CSV和一个管理这些类型的具体类,并执行将某个复杂类型映射到CSV类型的操作。每种CSV类型都扩展了2个接口Cleanable
和Modifiable
。
我有一个像这样的模板类:
class CSVManager<CSVType extends Cleanable & Modifiable> {
private Class templateType;
public CSVManager() {
templateType = ReflectionUtils.getTemplatedParameterClass(this.getClass());
}
public CSVType mapToCSVType(ComplexType data) {
}
}
我有一个我的mappers实现的Mapper
接口
interface Mapper<Source, Destination> {
Destination map(Source source);
}
CSV类型就像
class Type1 implements Cleanable, Modifiable {
// Fields here
}
好的,我已经将Mappers定义为
class ComplexTypeToType1Mapper implements Mapper<ComplexType, Type1> {
@Override
Type1 map(ComplexType complexType) {
// Map fields to type and return
return new Type1();
}
}
现在我基本上想要做的是根据已创建的Manager类型获取Mapper。所以我在CSVManager类中创建了一个静态HashMap,就像这样
private static Map<Class, Mapper<ComplexType, ?> mapperMap = createMappersMap();
private static Map<Class, Mapper<ComplexType, ?> createMappersMap() {
Map<Class, Mapper<ComplexType, ?> hashMap = new HashMap<>();
hashMap.put(Type1.class, new ComplexTypeToType1Mapper());
// other mappers
return hashMap;
}
我得到的第一个错误就在这里。我无法在地图中放置具体类型的Mapper。
我尝试在此处添加此内容的原因是因为我希望我的mapToCSVType
函数只获取映射器并执行映射并返回CSV类型的具体类型实例。这就是我在该功能中所做的
public CSVType mapToCSVType(ComplexType data) {
return (CSVType)mapperMap.get(templateType).map(data); // This should return concrete type like Type1 etc, not the interface
}
但这不起作用。谁能告诉我这里我做错了什么?我试图避免每种类型的条件,这就是为什么我使用Map来获得精确的映射器。任何帮助将不胜感激。