ModelMapper:如何映射到已知具体类型的通用实例列表

时间:2019-10-16 09:39:30

标签: java modelmapper

我想将List<>的确切List<T>ModelMapperjava.lang.Class转换为T。但是ModelMapper只保留实例化T ...的公共父类。

适合您的环境:我想将DTO列表转换为Domain列表,但是正如在每个Service类中所做的那样,我将其提取到通用抽象Service中。

public class BaseClass {}
public class SubClass1 extends BaseClass {}

public <T extends BaseClass> List<T> getList(Class<T> specificClass) {
    ...
    Type listType = new TypeToken<List<T>>(){}.getType(); // here problem

    List<T> responseList = modelMapper.map(listIAlreadyHave, listType);

    return responseList;
}

List<SubClass1> list = doIt(SubClass1.class);

Inspiration here

我希望列表是SubClass1实例的列表,但是我只得到BaseClass实例。 我不怪Java没有低估我的listType定义,因为T在运行时未知,但是我如何使用慷慨提供的specificClass参数呢?

谢谢亲爱的社区!

2 个答案:

答案 0 :(得分:0)

您可以使用显式映射,并指定映射器将一个实例转换为另一个实例的方式。您不是要让SubClass1扩展BaseClass吗?如果您想要的话,您可以利用多态性。

祝你有美好的一天!

答案 1 :(得分:0)

调用泛型方法时,类型已被擦除,并且TypeToken捕获泛型List<T>类型。

该方法用T extends BaseClass定义,这就是为什么要进行此类转换的原因。如果删除扩展,它将把您的数据类转换成它自己。

解决问题的一种方法是在擦除之前捕获类型:可以在调用通用方法之前完成。

public class BaseClass {}
public class SubClass extends BaseClass {}
public class OtherClass {}

public <T extends BaseClass> List<T> getList(Type listType, List<?> listIAlreadyHave) {
    return new ModelMapper().map(listIAlreadyHave, listType);
}

List<OtherClass> listIAlreadyHave = buildList();

// Capture type before erasure
Type listType = new TypeToken<List<SubClass>>() {}.getType();

List<SubClass> list = getList(listType, listIAlreadyHave);;