我有很多想转换为Dto的bean
在每个班级,我都会做类似
的事情private List<AddressDto> convertsToDto(List<Address> addresses) {
List<AddressDto> addressesDto = new ArrayList<>();
addresses.stream().map((address) -> convertToDto(address)).forEachOrdered((addressDto) -> {
addressesDto.add(addressDto);
});
return addressesDto;
}
convertToDto将出现在每个类中......但对于convertedToDto,我将放入一个抽象类,其中每个类都将扩展它并将通用的translateToDto方法放入泛型类型
public abstract class BaseService {
public List<T> convertsToDto(List<R> beans) {
List<T> listDto = new ArrayList<>();
beans.stream().map((bean) -> convertToDto(bean)).forEachOrdered((dto) -> {
listDto.add(dto);
});
return listDto;
}
}
我总是得到T
而R
未知......似乎错过了什么。
答案 0 :(得分:3)
首先将T
和R
类型参数添加到您的通用方法中。但是,这不会起作用,因为convertToDto(bean)
将保持未定义。
这里有几个选项:
这是第一种方法:
interface Bean<T> {
T convertToDto();
}
public abstract class BaseService {
public <T,R extends Bean<T>> List<T> convertsToDto(List<R> beans) {
return beans.stream().map((b) -> b.convertToDto()).collect(Collectors.toList());
}
... // Additional methods
}
这是第二种方法:
public abstract class BaseService {
public <T,R> List<R> convertsToDto(List<T> beans, Function<T,R> convert) {
return beans.stream().map((b) -> convert.apply(b)).collect(Collectors.toList());
}
}
答案 1 :(得分:1)
您的BaseService类未定义这些泛型类型。
Try
public abstract class BaseService<T, R> {
...
}
public class AddressService extends BaseService<AddressDto, Address> {
...
}
答案 2 :(得分:1)
您可以使用Dto<T>
这样的通用界面来实现此目的。
您将能够将您的通用转换方法看起来像这样:
public <T extends Dto<R>> List<T> convertsToDto(List<R> beans) {
}
您的Dto
个对象将实现将它们映射到基础对象的接口。