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

标签 java modelmapper

我想用 ModelMapper 进行转换一个List<>List<T>确切知道java.lang.ClassT 。但是ModelMapper只保留实例化T的公共(public)父类...

对于您的上下文:我想将 DTO 列表转换为域列表,但当我在每个服务类中执行此操作时,我将其提取到通用抽象服务中。

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我慷慨提供的参数?

感谢亲爱的社区!

最佳答案

当调用泛型方法时,类型已经被删除并且 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);;

关于java - ModelMapper:如何映射到已知具体类型的通用实例列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58410273/

相关文章:

java - 在线程java中计算pi

java - 如何使用 ModelMapper 处理集合到列表的转换

java - 使用转换器和提供程序而不是属性映射时如何让 ModelMapper.validate() 成功?

Java 模型映射器 : map DTO to EmbeddedId entity class

java - ModelMapper:如何映射作为泛型传递的 List<String>?

java - 是否可以从小程序执行命令?

java - 将 ExoPlayer 添加到 GLSurfaceView 时出现黑屏

java - 如何监控 Apache Commons VFS 中文件传输的进度?

java 最近的路口

java - 使用 ModelMapper 将 JsonNode 转换为对象