我在java中有以下情況;有一個類實作了一個最終的方法,但我需要這種方法的回傳型別與它呼叫它的類完全相同。因為我希望方法是最終的,所以我不能修改子類中的回傳資料型別,因為那是非法的。
有沒有辦法在不犧牲最終性的情況下存檔它,并且必須為實作它的所有子類覆寫這種方法?即使該方法不是最終的,以這種方式實作它仍然會更快。
代碼將是這樣的:
class Parent
{
public currentClass finalMethod() {...}
}
class Children extends Parent {}
public static void main(String args[])
{
Children c = new Children();
System.out.print(c.finalMethod().getClass().getName()); // Would print Children
}
嘗試使用反射和泛型無濟于事。例子:
class Parent
{
public this.getClass() finalMethod() {...} //Many Errors
public <extends Parent> finalMethod() {...} // Returns Parent even if called by Child
public Class<? extends Parent>[] getVecinos() // Returns Class<? extends Parent> thus can't use polymorphism which is the use case
}
我知道我可以使用強制轉換,但仍然不是最好的解決方案。
uj5u.com熱心網友回復:
默認行為是你會得到你正在尋找的東西,只要finalMethod不使用其他型別生成新實體。
要使用您的代碼:
class Parent {
public final Parent finalMethod() {
return this;
}
}
有了這個,c.finalMethod().getClass().getName()回傳Children。這是因為thisinsidefinalMethod()是使用創建new Children()并getClass()回傳物件的運行時類的同一物件。
這使用繼承,只要你可以使用Parent作為回傳型別,你應該沒問題。但是,如果您的目標是呼叫特定Children于 的回傳值的方法finalMethod(),則可能需要進行Parent泛型。像這樣的東西:
class Parent<C extends Parent<C>> {
public final Parent<C> finalMethod() {
//whatever
return this;
}
}
class Children extends Parent<Children> {
}
這將使以下代碼有效,仍然產生相同的輸出:
Parent<Children> c = new Children(); //or Children c = new Children();
System.out.print(c.finalMethod().getClass().getName());
這樣做的好處是允許您在Child沒有預先轉換的情況下對特定方法進行靜態參考。但這不是正確的解決方案,除非可以Parent通用。它也不是故障安全的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/450463.html
