Как я могу добавить элементы типа подкласса в массив с суперклассом в качестве типа элемента?

У меня есть класс 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(); 
}
Другие вопросы по тегам