[英]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.