簡體   English   中英

如何將A類轉換為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

TrackingCategoryAccountingObject繼承(擴展),所以我嘗試通過(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上進行filtermap ,但如果不是第一個但第二個條目是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM