我想将List<>
的确切List<T>
与ModelMapper的java.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);
我希望列表是SubClass1
实例的列表,但是我只得到BaseClass
实例。
我不怪Java没有低估我的listType
定义,因为T在运行时未知,但是我如何使用慷慨提供的specificClass
参数呢?
谢谢亲爱的社区!
答案 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);;