Мне интересно, что конкретно позволяет объекту одного класса быть отличным в качестве другого класса. Глядя на Class.isInstance (Object obj) javadoc, он предполагает, что объект должен быть «совместим с назначением» с другим классом, чтобы быть отличным для этого класса. Но что означает «совместимость с назначением»?Что делает назначение объекта совместимым с другим классом?
Я пытаюсь выяснить, как следующие возвратил ClassCastException:
public class A
{
multiple private attributes
No constructor
multiple public methods
}
public class B extends A
{
blank default constructor
2 additional private attributes
4 additional public getter/setter methods for these attributes
}
Линия
B b = (B)variable.getA() // where getA() returned an instance of class A
возвращает ClassCastException А не может быть брошена как B. Я знаю, что Отливки из родительский класс к подклассу - плохая идея. Я не писал код, о котором идет речь, я просто смотрю на него в качестве поддержки производства.
Класс B является единственным классом в коде, который простирается от А. Таким образом, результат Гета() не является объектом другого подкласса А (скажем, С) приведение к А.
Так почему в этом экземпляр может Java не бросать объект класса A в, казалось бы, совместимый класс B?
_leads Java для believe_ Java не нужно угадать. Он знает, что такое тип объекта. Если это экземпляр конкретного типа 'A', то это не' B'. –
Спасибо Sotirios. Я переформулировал последнее предложение, надеюсь, подытожим немного лучше. И A, и B имеют одинаковые атрибуты и методы, причем B имеет пару дополнительных. Поэтому вы могли бы подумать, что объект класса B может быть создан с использованием атрибутов объекта класса A со значениями по умолчанию класса B, используемыми для дополнительных атрибутов. Этот вопрос направлен на то, чтобы помочь мне понять, почему они кажутся совместимыми, но на самом деле это не так. – lgrayden
Каково ваше определение совместимости. A и B выглядят одинаково в виде A, но B имеет что-то дополнительное. Экземпляр A не может работать как B, потому что у этого экземпляра нет «лишнего», которое имеет только B. Другими словами, B можно отличить как A, потому что «B расширяет A», как вы указали в своем коде. –