簡體   English   中英

Java方法覆蓋/接口問題

[英]Java method override/interface problem

我有

interface FooI
class FooA implements FooI
class FooB implements FooI
class FooC implements FooI

我寫了一個類“Handler”,它有以下方法

static double handle(FooA f)
static double handle(FooB f)
static double handle(FooI f)

我有一個像下面這樣的功能:

void caller(FooI f)
{
    Handler.handle(f);
}

f只是被稱為實現FooI的類。 然而,f是FooA的一個實例

調用FooI的方法而不是調用FooA的方法。

當我使用f.getClass()。getName()時,我得到了正確的類名(FooA)。

我很困惑,因為我期望最適合的方法被調用,即FooA的方法。

我想使用FooI方法作為后備來處理可以在以后實現的類,並且我還想處理f而沒有一個大函數,我正在對實現我的接口的所有當前已知類進行instanceof檢查。

這樣做有什么好辦法?

重載解析在編譯時完成,而不是在Java中執行時 根據變量的編譯時類型選擇簽名。 僅在執行時確定覆蓋

Java等語言的常見解決方案是使用雙重調度訪問者模式

就個人而言,我不是這個的忠實粉絲。 我寧願嘗試設計自己的方式。 當然,這並不總是可行,但至少值得嘗試。

您希望JVM 在運行時為最佳擬合方法進行分析但實際上並不會發生這種情況。 相反,在編譯期間選擇要調用的方法,此時唯一已知的信息是f是實現FooI的類。

解決該問題的最佳方法是避免檢查實例的方法,可能是將“句柄”方法移動到那些類FooA,FooB,FooI中。

我不確切知道您的設計是什么,但是“處理”功能可能更好地放在您的具體FooI實現中嗎?

Java解決了在編譯時使用引用類型調用哪個方法,在您的示例中為FooI - 如果您考慮它,這是有道理的,因為引用類型是它在編譯時必須繼續進行的所有操作

您的Handler類不handle(FooI f) ,因此就編譯器而言,沒有有效的handle方法可以調用。

你不應該使用靜態方法,靜態方法遵循非最終實例方法之外的其他規則

您可以使用處理程序實現將接口轉換為抽象類。 然后你實現它,FooA和FooB覆蓋它

暫無
暫無

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

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