Это как минимум кодовый запах.
Скажем, у вас есть class A
и class B extends A
, и у вас есть метод foo()
в классе B
. Теперь предположим, что у вас есть объект типа A
, который может быть a B
. Логически это означает, что в вашем контексте вам нужен объект типа A
, независимо от супертипа. Так зачем вам звонить foo()
? Если вам нужен вызов, почему бы не иметь объект B
непосредственно в вашем контексте?
Я предлагаю вам поместить foo()
метод только в A
тогда и только тогда, когда имеет смысл, чтобы он был в A, а не так, вы можете просто переопределить его в B
.
Полагаю, ваш дизайн ошибочен, но может и не быть. В этом случае вы можете использовать оператор instanceof
, чтобы выяснить, относится ли ваш объект к типу B
, после чего вы можете безопасно использовать его.