У нас был интересный угловой случай сегодня на работе, касающийся метода вызова на 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 и вы хотите вызвать doFoo() в экземпляре ExtendedFoo_ ", тогда он должен выбрать' doFoo (ExtendedBar) '. Смотрите это: http://ideone.com/sJCZ3W – Hackerdarshi
@Hackerdarshi Huh, вы правы, тогда, я думаю, у меня была другая проблема (работает под Android ART здесь, а не с родным JVM).Спасибо за очищение этого (и идеон закладок :)) –