在模板化的类中使用Map中的嵌套泛型

时间:2017-08-02 08:31:17

标签: java templates dictionary generics

我现在已经在嵌套泛型方面苦苦挣扎了一段时间。这就是我现在能做的事情: 基本上我有一些类型的CSV和一个管理这些类型的具体类,并执行将某个复杂类型映射到CSV类型的操作。每种CSV类型都扩展了2个接口CleanableModifiable。 我有一个像这样的模板类:

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来获得精确的映射器。任何帮助将不胜感激。

0 个答案:

没有答案