[英]How to convert List<Class A> to Map<String, List<Class B>>
[英]How to convert a class A to class B?
我正在研究一種方法,在這里我寫了以下行:
public class XeroTrackingCategoryClient extends TrackingCategoryTransformationClient {
public List<ErpListEntry> getCustomFieldListDataByName(String entityCode, String customFieldListName, Boolean fullObject, DateTime lastSyncTime, Boolean isActive) {
try {
Optional<TrackingCategory> trackingCategory = trackingCategoryTransformationClient.getErpListDataById(entityCode, null, customFieldListName, null).stream().findFirst();
...cont.
正如您從下面的TrackingCategoryTransformationClient
類中看到的那樣,這會產生錯誤,因為抽象方法getErpListDataById
返回 Optional <AccountingObject>
而不是 Optional <TrackingCategory>
這是變量所期望的。
我無法更改泛型中 T 的類,因為其他方法依賴於它
相反,我想知道是否可以將AccountingObject
對象轉換為TrackingCategory
?
TrackingCategory
從AccountingObject
繼承(擴展),所以我嘗試通過(TrackingCategory)
向下轉換為 trackingCategoryTransformation 類,但這給了我一個“不可轉換類型”錯誤,其中 AccountingObject 無法轉換為 TrackingCategory
因此,我試圖了解如何將類轉換為 TrackingCategory。
TrackingCategoryTransformationClient
public abstract class TrackingCategoryTransformationClient extends BaseTransformationClient {
protected TrackingCategoryTransformationClient(AccountingPackageService accountingPackageService, IHttpHeaderFactory httpHeaderFactory, TransformationConnector transformationConnector, RestTemplate restTemplate) {
super(accountingPackageService, httpHeaderFactory, transformationConnector, restTemplate);
}
public TrackingCategoryTransformationClient(SSLRestTemplate restTemplate, TransformationConnector transformationConnector, WhereClauseBuilderFactory whereClauseBuilderFactory, AccountingPackageService accountingPackageService, IHttpHeaderFactory httpHeaderFactory) {
super(accountingPackageService, httpHeaderFactory, transformationConnector, restTemplate);
}
public abstract <T extends AccountingObject> List<T> getErpListDataById(String entityCode, AccountingObjectType accountingObjectType, String customFieldListName, List<CodeRef> filterList);
}
有兩種可能的解決方案(使用TrackingCategory extends AccountingObject
)。 第一個是強制轉換為TrackingCategory
。:
Optional<TrackingCategory> trackingCategory = trackingCategoryTransformationClient
.getErpListDataById(entityCode, null, customFieldListName, null)
.stream()
.filter(TrackingCategory.class::isInstance)
.map(TrackingCategory.class::cast)
.findFirst();
您還可以在Optional
上進行filter
和map
,但如果不是第一個但第二個條目是TrackingCategory
,它將為空:
Optional<TrackingCategory> trackingCategory = trackingCategoryTransformationClient
.getErpListDataById(entityCode, null, customFieldListName, null)
.stream()
.findFirst()
.filter(TrackingCategory.class::isInstance)
.map(TrackingCategory.class::cast);
第二種解決方案是給編譯器一個泛型T
的提示,但您應該確保所有元素都是TrackingCategory
:
Optional<TrackingCategory> trackingCategory = trackingCategoryTransformationClient
.<TrackingCategory> getErpListDataById(entityCode, null, customFieldListName, null)
.stream()
.findFirst();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.