工作

2

我使用的是類Foo提供這些方法:工作

String overloadedMethod(Object) 
String overloadedMethod(Goo) 

由於Java對非接收者的說法靜態調度,我不能把我的value (這是一個Object,但可能有動態類型Goo),並依賴於JVM動態選擇「正確」的方法。

這是我目前(醜陋的)解決方法:

Object value = ...; 
Foo foo = new Foo(); 
if (value instanceof Goo) { 
    Goo gooValue = (Goo) value; 
    return foo.overloadedMethod(gooValue); // -> overloadedMethod(Goo) 
} else { 
    return foo.overloadedMethod(value); // -> overloadedMethod(Object) 
} 

是否有這樣做沒有(包含重載方法的類)修改Foo代碼的更好的辦法?

回答

3

當然,你總是可以使用反射來查找適用該方法的最具體的版本,但可能會很麻煩真正的快。

但是,如果這兩個調用導致完全不同的行爲,那麼foo是任一設計成在一個訪問者模式被使用(即,具有雙調度),或者它是斷開的。

2

你可以看看the Java MultiMethod Framework。這幾乎是你提出的一個層次,但至少它被抽象爲一個邏輯模塊,這不是你的責任?

(據我所知,有沒有乾淨的方式來做到這一點,而不訴諸反思/ instanceof黑客)