1.
Цитата:
Откуда такое предположение
|
потому что с Ваших же слов
Цитата:
Почему же вызывается метод destroy класса MapObject?
|
2.
Цитата:
Почему в данном случае объект msg не приводится к типу C? Ведь данный пример яв-ся аналогом предыдущего.
|
Ничего подобного. Не путайте Класс объекта с Типом переменной. В случае с массивом возвращается ТИП Object, но сам возвращаемый объект имеет тот Класс, чьим экземпляром он был создан, в данном случае MapObject. Поэтому его можно скастовать для сохранения в переменной с Типом MapObject и вызывать у него методы класса MapObject. В Вашем "аналоге" Вы пытаетесь вызывать у экземпляра класса В (а точнее – у null, ибо кастинг вернет null) методы класса С. Откуда же им взяться?
Еще раз. Кастинг не меняет класс объекта. Он проверяет, можно ли использовать объект как определенный Тип данных, и возвращает null, если нельзя (как в Вашем примере). Другими словами, если в массив из первого примера сложить экземпляры другого класса, они не будут кастоваться в MapObject, as вернет null и Вы получите ошибку.
Класс это то, чем объект "является" сам по себе. А тип это то, как он используется в текущем контексте. Это может быть реальный класс объекта, любой из его супер-классов и любой из его Интерфейсов. Но никак не любой класс, который взбредет в голову.
|