Если у вас есть ссылка на объект, где переменная определена как ABC
, то вы можете вызывать только те методы, которые определены в классе ABC
. Даже если базовый объект имеет тип DEF
, сама переменная определена для хранения ABC
.
Попробуйте изменить код из этого:
ABC obj2 = new DEF();
на следующее:
DEF obj2 = new DEF();
Это будет работать, потому что вы определяете obj2
для типа DEF
.
Вот еще один пример, показывающий создание строки, сначала с переменной, определенной для типа String
, а другой с типом, определенным как Object
.
String s = new String();
s.charAt(99); <-- this is valid on a String
Object o = new String();
o.charAt(99); <-- same thing, but not allowed on Object
Обходной путь должен был бы использовать instanceof
для проверки, действительно ли obj2
является экземпляром DEF
, и если да, временноиспользуйте его как DEF
, разыгрывая его так:
if (obj2 instanceof DEF) {
((DEF) obj2).newMethod();
}