Java 泛型方法,泛型类型未知
我有很多bean我想转换成Dto 在每节课上,我都做类似的事情Java 泛型方法,泛型类型未知,java,generics,Java,Generics,我有很多bean我想转换成Dto 在每节课上,我都做类似的事情 private List<AddressDto> convertsToDto(List<Address> addresses) { List<AddressDto> addressesDto = new ArrayList<>(); addresses.stream().map((address) -> convertToDto(address)).forEac
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;
}
private List convertsToDto(列表地址){
List addressedto=new ArrayList();
addresses.stream().map((地址)->convertto(地址)).forEachOrdered((地址到)->{
addressedto.add(addressedto);
});
返回地址DTO;
}
每个班级都会有一名学生。。。。但对于convertsToDto,我将在t中放入一个抽象类,其中每个类都将对其进行扩展,并放入一个泛型类型为的泛型convertsToDto方法
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;
}
}
公共抽象类BaseService{
公共列表转换器stodto(列表bean){
List listDto=new ArrayList();
beans.stream().map((bean)->convertto(bean)).forEachOrdered((dto)->{
列表dto.add(dto);
});
返回listDto;
}
}
我总是得到
T
,而R
是未知的。。。您的BaseService类没有定义这些泛型类型
Try
public abstract class BaseService<T, R> {
...
}
public class AddressService extends BaseService<AddressDto, Address> {
...
}
试试看
公共抽象类基服务{
...
}
公共类AddressService扩展了BaseService{
...
}
您的BaseService类没有定义这些泛型类型
Try
public abstract class BaseService<T, R> {
...
}
public class AddressService extends BaseService<AddressDto, Address> {
...
}
试试看
公共抽象类基服务{
...
}
公共类AddressService扩展了BaseService{
...
}
您可以使用类似于Dto的通用接口来实现此功能
您将能够使您的通用转换方法如下所示:
public <T extends Dto<R>> List<T> convertsToDto(List<R> beans) {
}
public List convertsToDto(列表bean){
}
您的Dto
对象将实现将它们映射到基本对象的接口。您可以使用类似Dto
的通用接口来实现此功能
您将能够使您的通用转换方法如下所示:
public <T extends Dto<R>> List<T> convertsToDto(List<R> beans) {
}
public List convertsToDto(列表bean){
}
您的Dto
对象将实现将它们映射到基本对象的接口。首先向通用方法添加T
和R
类型参数。但是,这不会起作用,因为converttoto(bean)
将保持未定义状态
您在这里有几个选项:
- 您可以定义bean接口来生成其DTO,或者
- 您可以将bean传递给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());
}
}
接口Bean{
T convertto();
}
公共抽象类基服务{
公共列表转换器stodto(列表bean){
返回beans.stream().map((b)->b.convertto()).collect(Collectors.toList());
}
…//其他方法
}
以下是第二种方法:
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());
}
}
公共抽象类BaseService{
公共列表convertsToDto(列表bean、函数转换){
返回beans.stream().map((b)->convert.apply(b)).collect(Collectors.toList());
}
}
首先在泛型方法中添加T
和R
类型参数。但是,这不会起作用,因为converttoto(bean)
将保持未定义状态
您在这里有几个选项:
- 您可以定义bean接口来生成其DTO,或者
- 您可以将bean传递给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());
}
}
接口Bean{
T convertto();
}
公共抽象类基服务{
公共列表转换器stodto(列表bean){
返回beans.stream().map((b)->b.convertto()).collect(Collectors.toList());
}
…//其他方法
}
以下是第二种方法:
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());
}
}
公共抽象类BaseService{
公共列表convertsToDto(列表bean、函数转换){
返回beans.stream().map((b)->convert.apply(b)).collect(Collectors.toList());
}
}
是否可以将T和R作为类型参数添加到函数中?又名“publicsistconverstodto(列表bean)”泛型在编译时被删除。在运行时,它总是一个对象列表。您应该将类型作为参数传递。为什么需要使用泛型?为什么不直接使用基本抽象类?也许可以将t和R作为类型参数添加到函数中?又名“publicsistconverstodto(列表bean)”泛型在编译时被删除。在运行时,它总是一个对象列表。您应该将类型作为参数传递。为什么需要使用泛型?为什么不直接使用基本抽象类呢?从第一个选项开始,在我的类中,当我尝试调用方法convertsToDto时,我得到:类BaseService中的方法convertsToDto不能应用于给定的类型;必需:找到列表:列表原因:推理变量R具有不兼容的边界相等约束:地址上限:Bean,其中R、T是类型变量:R扩展在方法convertsToDto(列表)中声明的Bean T扩展在方法convertsToDto(列表)中声明的对象@roberttrudel看起来您的Bean
接口不同-它需要两个参数,而不是一个。第一个解决方案使用一个参数,T
,它对应于目标DTO类型。换句话说,如果Address
的目标DTO是AddressDto
,那么Address
必须实现Bean
;因为输入参数应该不同于输出,所以第二种方法似乎更容易实现implement@roberttrudel第二种方法还允许您在无法访问bean类并且无法在其上“固定”新接口时使用此代码。但是,每次调用convertToDtos
时,它都需要一个lambda或converter函数对象。从第一个选项开始,在我的类中,当我尝试调用方法convertsToDto时,我得到:类BaseService中的方法convertsToDto不能应用于给定的类型;必需:List found:List reason:推理变量R具有不兼容的边界等式约束:Address upper bounds:Bean,其中R、T是类型变量:R扩展在me中声明的Bean