![](/img/trans.png)
[英]How child class object accesses parent class method or Data Member via extends keyword in Java
[英]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.