Как мне создать список ArrayList, заполненный различными типами объектов?

У меня разные классы для банковской системы. Эти классы:

  • Сберегательный счет
  • Студенческий счет
  • Нормальный счет

Теперь я хочу создать ArrayList и заполнить его объектами всех этих разных классов, например. первым элементом является studentaccount1, вторым элементом является экономия учетной записи 2 ... и так далее.

Итак, я попытался использовать тип объекта:

List<Object> accountList = new ArrayList<>();

Но при таком подходе по какой-то причине я не могу получить доступ к значениям, хранящимся в переменных класса, например:

accountList.add(saving1);

accountList.get(saving1) не вызывает методы, объявленные в этих классах.

Итак, как я могу это исправить или реализовать каким-то другим способом?

Обновлено:

Я забыл упомянуть, что обычная учетная запись является родительским классом, а StudentAccount и SavingsAccount являются подклассами.

Поэтому я понял, что могу просто объявить ArrayList как тип NormalAccount (тип родительского класса) и добиться желаемого.

Какова иерархия классов среди этих классов?

user7 21.05.2018 15:40

У вас есть родительский класс для трех классов учетных записей?

GBlodgett 21.05.2018 15:40
stackoverflow.com/questions/20295671/…
Sedrick 21.05.2018 15:40

NormalAccount - это родительский класс, Student и Savings - это подклассы, унаследованные от NormalAccount.

ValentineJ 21.05.2018 15:41

Вы можете создать иерархию среди этих объектов, кажется, класс BankAccount может служить родительским для этих классов, которые у вас есть. А затем вы можете добавить базовые методы к своим родительским и методы, специфичные для учетной записи, к своим дочерним классам. тогда список будет следующим: List <BankAccount> list = new ArrayList <> (); когда получите, нужно проверить, какой экземпляр какой.

SomeDude 21.05.2018 15:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
114
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Создайте интерфейс Account с общими методами и заставьте все эти учетные записи реализовать его.

public class SavingsAccount implements Account { ... }

Затем создайте список типа, реализующего этот интерфейс.

List<Account> accountList = new ArrayList<>();

Я не рекомендую вам создавать маркер интерфейс только для этой цели. Это плохая идея. Интерфейс должен иметь общедоступные методы.

В качестве альтернативы, Account может быть (абстрактным) классом, и эти конкретные учетные записи будут расширяться от него - включать в него общие функции, чтобы избежать дублирования кода. Все зависит от того, чего именно вы хотите достичь и что подходит вашему дизайну.

Редактировать:

Вы пропустили, чтобы сообщить нам довольно важный факт, что NormalAccount является родительским для всех остальных. Таким образом, решение довольно простое:

List<NormalAccount> accountList = new ArrayList<>();

У вашего класса есть суффикс _Account, поэтому я думаю, что у них похожие поля.

Сделайте для них суперкласс, интерфейс или класс:

public class Account {
}

public class StudentAccount extends Account {
}

Затем объявите свой список как:

List<Account> accountList = new ArrayList<>();

Account normal = new NormalAccount();
accountList.add(normal);
Ответ принят как подходящий

Вы не можете получить доступ к методам классов. Вместо этого вы можете получить доступ только к методам класса Object в вашем примере.

Я думаю, вы можете поместить объявления общих методов в интерфейс или абстрактный класс, а затем реализовать их.

I forgot to mention that Normal account is the parent class and both "StudentAccount" and "SavingsAccount" are subclasses.

So can I just declare the ArrayList as a "NormalAccount" type and then be able to access the variables?

Да, точно. Вы можете определить это как

List<NormalAccount> accountList = new ArrayList<>();

Когда вы используете класс Object, во время извлечения данных вам необходимо преобразовать извлеченные данные, чтобы иметь возможность использовать методы. Попробуйте что-то вроде этого:

(SavingsAccount) accountList.get(saving1)

вы сможете получить доступ к методам

Другие вопросы по теме