Как я могу добавить элементы типа подкласса в массив с суперклассом в качестве типа элемента?
У меня есть класс BetterBuilding, который расширяет Building, и класс BetterElevator, который расширяет Elevator. Building в своем конструкторе заполняет массив Elevator[] elevators объектами Elevator. Теперь я пытаюсь создать конструктор BetterBuilding следующим образом:
public BetterBuilding(File f) {
super(f);
for(int i=0; i<elevatorNum; i++) {
elevators[i] = new BetterElevator(20);
}
System.out.println(elevators[0].test());
}
Поэтому я попытался использовать конструктор суперкласса, а затем изменить содержимое массива Лифты, чтобы теперь он содержал BetterElevator в позиции 0. Но, когда я пытаюсь вызвать Лифты [0].test(), я получаю сообщение об ошибке, что Лифты [0] - это Лифт (test() - это метод, доступный только для BetterElevators). Что я делаю неправильно? Заранее спасибо!
1 ответ
Итак, ваш класс Building содержит массив лифтов. Поскольку BetterElevator является Elevator (наследование!), Нет проблем с назначением BetterElevators для Elevator-Array.
Однако при доступе к массиву в здании тип массива является общим типом Elevator, независимо от фактического типа содержащегося массива.
Чтобы получить доступ к методам BetterElevators, вы должны сначала привести его из Elevator.
Поскольку потенциально могут существовать EvenBetterElevators, рекомендуется проверять тип с instanceof first, иначе вы рискуете ClassCastExceptions во время выполнения:
if (building.elevators[0] instanceof BetterElevator) {
((BetterElevator)elevator).test();
}