今天我們在工作中遇到了一個有趣的案例,涉及Java中的方法調用。想象一下以下內容:強制調用專門的方法
class Bar {}
class ExtendedBar extends Bar {}
class Foo {
void doFoo(Bar bar) {}
}
class ExtendedFoo extends Foo {
void doFoo(ExtendedBar exBar) {}
}
現在你有ExtendedBar
一個實例,並要撥打doFoo()
上ExtendedFoo
一個實例。在我們的測試中,運行時間選擇Foo
s doFoo(Bar)
實現,而不是doFoo(ExtendedBar)
從ExtendedFoo
。
當然這個問題有一個簡單的方法 - 我們只需要將doFoo
重命名爲其他的東西 - 但是,如果不重命名該方法,某種程度上可能會讓我們感到震驚,因爲它保留了方法的名稱這裏用在強大的傳統語境中。
提示:'doFoo(ExtendedBar)'* does ** not ***'Override''doFoo(Bar)'。 *名稱*不是真正的問題,方法有不同的簽名。 –
如果「_你有一個ExtendedBar的實例,並且你想對ExtendedFoo_的一個實例調用doFoo()」,那麼它應該選擇'doFoo(ExtendedBar)'。看到這個:http://ideone.com/sJCZ3W – Hackerdarshi
@Hackerdarshi嗯,你是對的,那麼我想我有一個不同的問題(在這裏運行Android ART,而不是本機JVM)。感謝您清除那個(並且ideone被加入書籤:)) –