У меня разные классы для банковской системы. Эти классы:
Теперь я хочу создать ArrayList и заполнить его объектами всех этих разных классов, например. первым элементом является studentaccount1, вторым элементом является экономия учетной записи 2 ... и так далее.
Итак, я попытался использовать тип объекта:
List<Object> accountList = new ArrayList<>();
Но при таком подходе по какой-то причине я не могу получить доступ к значениям, хранящимся в переменных класса, например:
accountList.add(saving1);
accountList.get(saving1) не вызывает методы, объявленные в этих классах.
Итак, как я могу это исправить или реализовать каким-то другим способом?
Обновлено:
Я забыл упомянуть, что обычная учетная запись является родительским классом, а StudentAccount и SavingsAccount являются подклассами.
Поэтому я понял, что могу просто объявить ArrayList как тип NormalAccount (тип родительского класса) и добиться желаемого.
У вас есть родительский класс для трех классов учетных записей?
NormalAccount - это родительский класс, Student и Savings - это подклассы, унаследованные от NormalAccount.
Вы можете создать иерархию среди этих объектов, кажется, класс BankAccount может служить родительским для этих классов, которые у вас есть. А затем вы можете добавить базовые методы к своим родительским и методы, специфичные для учетной записи, к своим дочерним классам. тогда список будет следующим: List <BankAccount> list = new ArrayList <> (); когда получите, нужно проверить, какой экземпляр какой.




Создайте интерфейс 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)
вы сможете получить доступ к методам
Какова иерархия классов среди этих классов?