我想用 ModelMapper 进行转换一个List<>
到 List<T>
确切知道java.lang.Class
的T
。但是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);
我希望列表成为 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/