Как использовать addAll() с разными типами

У меня есть курсовой проект, и я не могу решить следующую проблему:

Мне нужно создать связанный список, в который я могу добавить список элементов из класса с именем Person и список элементов из класса с именем Accounts, используя addAll()

List<Person> persons= new LinkedList<Person>();
List<Accounts> accounts= new LinkedList<Accounts>();
List<???> elements = new LinkedList<>();
elements.addAll(persons);
elements.addAll(accounts);

Мой учитель приказал сделать класс ElementsOfTheBank, чтобы заполнить место ???, но я не мог понять, как заставить его работать :(

Есть ли особая причина, почему это Accounts, а не Account?

g00se 22.11.2022 13:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужен общий тип, который используется всеми элементами банка. Тривиально, java.lang.Object является общим для них всех, но, возможно, вас просят сделать, например. public interface ElementOfBank, чтобы затем вы могли объявить свой класс Person как class Person implements ElementOfBank {}.

Как только вы это сделаете, вы можете объявить, что ваш список состоит из этого элемента: List<ElementOfBank> elements = ...;, и вы можете вызвать .addAll(persons) в таком списке. В конце концов, каждый экземпляр человека также является ElementOfBank, вот что означает class Person implements ElementOfBank.

Это своего рода плохой пример, но ваш учитель, вероятно, хочет, чтобы вы использовали наследование.

Поскольку человек и счет являются «элементами банка», ваши классы могут выглядеть так:

class ElementsOfTheBank {
    // common variables between Person and Account
}

class Person extends ElementsOfTheBank {
    // ...
}

class Account extends ElementsOfTheBank {
    // ...
}

Затем вы можете добавить оба типа в свой список:

List<ElementsOfTheBank> elements = new LinkedList<>();
elements.addAll(persons);
elements.addAll(accounts);

Да. ElementsOfTheBank также может быть интерфейсом

Maurice Perry 22.11.2022 14:30

Не используйте Коллекции только для объединения связанных объектов.

Нет особого смысла создавать List<Object>, чтобы Person и Account списки вместе. Введение общего супера из Person и Account тоже не кажется хорошей идеей. В чем преимущество привязки через Наследование физического лица и счета в банке? Я бы предпочел установить связь между человеком и его аккаунтами через Состав (а не Наследование).

Лучшим вариантом было бы создать class, скажем, Bank. Это инкапсулирует два списка. т.е. вы можете ввести поведение для управления банками-клиентами и их счетами, и экземпляр банка станет единой точкой входа для всех операций, которые вам нужно выполнить с ними.

public class Bank {
    private List<Person> persons= new LinkedList<>();
    private List<Accounts> accounts= new LinkedList<>();

    // constructors, getters
    
    public boolean createAccount() {
        // TO DO ...
        return ...;
    }

    public Person findPerson(SomeProperty id) {
        // TO DO ...
        return ...;
    }
}

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

tquadrat 22.11.2022 13:58

@tquadrat Ответы на SO предназначены для того, чтобы принести пользу читателям (не только OP). Вы признали, что логика верна, как ответ бесполезен. Во-вторых, злоупотребление коллекцией — это очень распространенный антипаттерн среди новичков, никто не может по-настоящему понять ОО, если они не в состоянии распознать, что набор свойств должен составлять объект. Это важный дизайн класса, а не корпоративная разработка. Похоже, вы упустили суть того, о чем я говорил. Если можно, я бы посоветовал избегать самоуверенных комментариев (вы выполнили требования к заданию OP?).

Alexander Ivanchenko 22.11.2022 14:16

Приятно читать об самоуверенных комментариях под ответом, основанным на мнении. Никто бы не жаловался на ваш "ответ", если бы вы действительно дали ответ на вопрос, а потом придумали проповедь о правильном дизайне и злоупотреблении коллекцией (см. ответ от 7evy о том, как это могло бы выглядеть). И, кстати, эта проповедь потрачена впустую для вопрошающего, потому что он только что переслал нам плохо сформулированный вопрос от своего учителя/инструктора/профессора.

tquadrat 22.11.2022 21:51

Значит, ваш голос должен означать, что этот ответ не имеет ценности? Я был бы признателен, если бы вы предоставили конструктивную критику вместо того, чтобы говорить от имени ОП.

Alexander Ivanchenko 22.11.2022 21:54

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