今天我们在工作中遇到了一个有趣的案例,涉及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被加入书签:)) –