簡體   English   中英

如何將子類實例分配給通用對象(擴展父對象)?

[英]How to assign child class instance to generic (extends parent) object?

我有一個這樣定義的父類:

public abstract MyParent {

    public static <MP extends MyParent> MP getInstance(Object... params) {
        return new MyChild(params);
    }
}

MyChild擴展MyParent 問題是編譯器不會讓我返回新的孩子,因為“ MyChild無法轉換為MP ”。 如果我在return之前return (MP) new MyChild(params);return (MP) new MyChild(params); ), return (MP) new MyChild(params);收到未經檢查的強制轉換警告。

正確的方法是什么?

MP可以是擴展MyParent的任何東西,但是MyChild不會成為MyParent的每個子類的子類。

我認為您的意圖是讓getInstance返回MyParent的實例,而不是使其返回通用MP。

自從你

有[三個] MyChilds,並且[]根據參數獲得一個不同的Child

您面臨一個基本挑戰:方法的調用者如何知道期望的返回類型,並且編譯器如何事先知道實際返回的對象的類型與調用者期望的類型兼容? 編譯時類型的安全性絕對取決於后一種分析,沒有這種分析,您想像中為避免強制轉換而進行的任何操作都是混淆性的。

方法參數與結果類型之間的具體關系尚不清楚,但是如果它取決於參數類型之外的任何其他條件,那么您就可以完成。 在這種情況下,就無法避免在某處進行強制轉換或等效轉換。 然后,您更好的選擇包括

  • 讓方法返回MyParent ,並接受如果調用程序依賴於特定的子類型,則調用者將需要MyParent結果(但不是)。

  • 為每種實際的返回類型創建一個不同的名稱的方法。 這樣可以避免調用程序進行強制轉換,但是如果給定的參數不對應於所調用方法的正確類型的對象,則可能需要提供例外。

當然,你也能夠修改方法,以便返回類型基於類型的參數。 例如,您可能

  • 在方法參數中包括類型標記 但是,要使其用作強制轉換等效項,該方法需要以某種方式將類型標記與其他參數關聯,或使用它來真正選擇返回類型,或將返回值強制為指定的類型。

暫無
暫無

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

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