通用方法,泛型类型未知

时间:2017-07-11 14:40:17

标签: java generics

我有很多想转换为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;
    }
}

我总是得到TR未知......似乎错过了什么。

3 个答案:

答案 0 :(得分:3)

首先将TR类型参数添加到您的通用方法中。但是,这不会起作用,因为convertToDto(bean)将保持未定义。

这里有几个选项:

  • 您可以定义bean接口以生成其DTO或
  • 您可以传递bean-to-DTO函数对象。

这是第一种方法:

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个对象将实现将它们映射到基础对象的接口。