Как мне создать ArrayList, заполненный объектами разных типов? - PullRequest
0 голосов
/ 21 мая 2018

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

  • SavingsAccount
  • StudentAccount
  • NormalAccount

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

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

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

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

accountList.add(saving1);

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

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

РЕДАКТИРОВАТЬ:

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

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

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

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

(SavingsAccount) accountList.get (save1)

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

0 голосов
/ 21 мая 2018

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

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

public class Account {
}

public class StudentAccount extends Account {
}

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

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

Account normal = new NormalAccount();
accountList.add(normal);
0 голосов
/ 21 мая 2018

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

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

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

Так что я могу просто объявить ArrayList как тип «NormalAccount» и затем иметь возможность доступа к переменным?

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

List<NormalAccount> accountList = new ArrayList<>();
0 голосов
/ 21 мая 2018

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

public class SavingsAccount implements Account { ... }

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

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

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

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

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

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

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