簡體   English   中英

無法在Java中將子類對象返回為通用超類返回類型

[英]Cannot return subclass object to generic superclass return type in Java

我必須實現一個方法,在該方法中,我將SuperClass(通用)作為返回類型,並且必須返回特定的子類(非通用)對象。 我的方法簽名是

private <A extends ClassA<B>, B>  SuperClass<A,B>  methodA(){
   subclass sc = new subclass();
   return sc;
}

編譯器抱怨無法將子類轉換為超類;

如果我將其類型轉換為SuperClass,則會向我發出警告,因為從子類到SuperClass為Uncheckedcast

我嘗試做的另一種方法是

private <SC extends SuperClass<A,B>, A extends ClassA<B>, B> SC methodA(){
   subclass sc = new subclass();
   return sc;
}

它仍然給我同樣的錯誤:無法從子類轉換為SC。

終於我嘗試了

private <SC extends SuperClass<A,B>, A extends ClassA<B>, B> SC methodA(){
   SC sc = (SC)new subclass();
   return sc;
}

並且現在有一個未經檢查的警告演員表。

我的子類聲明

 subclass extends SuperClass<ClassC, ClassD>
 where ClassC extends ClassA and ClassD is a concrete type.

我的超類宣言

 class SuperClass<A extends ClassA<B>, B>

誰能告訴我為什么我們不能將子類型對象返回給泛型超類,為什么沒有免費的警告方式呢?

您的代碼沒有意義。 大概, subclass使用特定的參數擴展了SuperClass ,否則它本身將是通用的。 (或者它可以從原始版本繼承,在邏輯上等效於為兩個參數傳遞Object 。)

這意味着可以使用這些特定參數將subclass安全地轉換為SuperClass 將其轉換為任何其他版本的SuperClass都是錯誤的。

編譯器告訴您代碼錯誤,並且編譯器正確。 重新考慮您的設計。

編輯以澄清:

假設我有這樣的代碼:

public class ClassE {}
public class ClassF extends ClassA<ClassE> {}

SuperClass<ClassF, ClassE> sc = someobject.<ClassF, ClassE>methodA();

現在,此代碼將被編譯,因為它具有正確的類型。 但是,如果您的代碼沒有產生錯誤或警告,則sc現在將指向一個subclass ,該subclass不擴展SuperClass<ClassF, ClassE> ,而擴展SuperClass<ClassC, ClassD> ,這是不同的。 希望此代碼正常工作是錯誤的。

我懷疑您在這里遇到XY問題。 您實際要解決的問題是什么? 因為您開始使用的解決方案無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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