2017-07-11 222 views
1

我有許多豆我想轉換爲DTO泛型方法,泛型類型不明

在每類中,我這樣做

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將是每一個類....但對於convertsToDto我要在TA抽象類,每一個類擴展的意願,並把通用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; 
    } 
} 

我總是TR是未知的...似乎錯過了一些東西。

+0

也許加T和R如式參數的函數?又名「公共列表 conversToDto(列表豆)」 – Wietlol

+0

泛型在編譯時被擦除。在運行時它總是一個對象列表。您應該將該類型作爲參數傳遞。 – PeterMmm

+0

爲什麼需要使用泛型?爲什麼你不只是使用你的基本抽象類? – fujy

回答

3

首先將TR類型參數添加到您的泛型方法中。但是,這不會訣竅,因爲convertToDto(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()); 
    } 
} 
+0

從第一個選項中,在我的類中,當我嘗試調用方法convertToDto時,我得到:方法convertToDto在類BaseService中不能應用於給定的類型; 需要:列表 發現:列表

理由:推斷變量R具有不相容邊界 等式約束:地址 上界:豆 其中R,T是類型的變量: ř延伸豆在方法 convertsToDto聲明(列表) T擴展在方法轉換爲對象的對象轉換爲(列表) –

+0

@roberttrudel它看起來像您的Bean接口是不同的 - 它需要兩個參數,而不是一個。第一種解決方案使用一個參數「T」,它對應於目標DTO類型。換句話說,如果您的目標地址DTO是AddressDto,則地址必須實現Bean 。 – dasblinkenlight

+0

我認爲應該有像公共T convertToDto(R r);因爲輸入參數應該不同於輸出 –

1

您的BaseService類沒有定義這些泛型類型。

Try 
public abstract class BaseService<T, R> { 
... 
} 

public class AddressService extends BaseService<AddressDto, Address> { 
... 
} 
1

你可以有一個通用接口,如Dto<T>這個工作。

而你,也就能夠讓您的通用方法皈依看起來像這樣:

public <T extends Dto<R>> List<T> convertsToDto(List<R> beans) { 
} 

Dto對象將實現該接口將它們映射到基礎對象。