Создайте метод для печати дочерних элементов arrayList в java - PullRequest
0 голосов
/ 01 мая 2020

У меня есть абстрактный класс Person, в котором трое детей: Admin, Employee и Student. Существует только один объект администратора.

У меня также есть класс, его "имя" - Statics и содержит все необходимые мне публичные c данные, например:

public class Statics {  

private static Person currentLoginUser;
private static ArrayList<Person> people = new ArrayList<>();
private static ArrayList<Student> students = new ArrayList<>();
private static ArrayList<Employee> employees = new ArrayList<>();
//We don't need ArrayList<Admin> because there is only one admin in the whole program

//Adder and getter methods:
//...
}

Вы можете спросить, что такое ArrayList<Person> в коде? Когда я создаю объект, я добавляю его как к «массиву собственных типов», так и к «ArrayList<Person>». Так что у ArrayList<Person> есть все.

Как я уже сказал, у меня есть только 1 администратор:

Person admin = new Admin(); //`Admin` extends `Person`

Я хочу создать метод (в Admin классе), который принимает arrayList из Person в качестве ввода и распечатывает данные. Итак, я сделал это:

//Admin class:
public void printList(ArrayList<Person> people){
//Do something
}

Предположим, admin хочет увидеть список учеников: я называю это так:

ArrayList<Student> s = Statics.getStudents();
((Admin)admin).printList(s); //admin object was created by `Person` class so I have to cast it to (Admin) to use `Admin`'s own methods.

Это (затмение) говорит, что:

Метод printList (ArrayList <<code>Person>) в типе Admin не применим для аргументов (ArrayList <<code>Student>)

Я пытался приведите его к человеку:

((Admin)admin).printList((ArrayList<Person>)s);

на этот раз я получил эту ошибку:

Невозможно привести из ArrayList <<code>Student> к ArrayList <<code>Person>

В этой ссылке ответ состоит в том, чтобы передать основной массив arrayList и проверить, принадлежат ли ему объекты типа "Student" или нет, а затем вывести его значение, но я не хочу проверять весь Person arrayList каждый раз! Я просто хочу метод, который принимает и arrayList детей Person (Employee, Student, et c) и печатает их.

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Ваша проблема с генериками. Даже если Student расширяет Person, List<Student> делает , а не расширяет List<Person>. Вот почему java generics имеет шаблон , который представлен ? (знак вопроса).

Если вы используете List<? extends Person>, это означает, что каждый элемент в списке является экземпляр Person или любой класс, который расширяет Person.

См. Обобщения, наследование и подтипы в уроке Generics Изучение Java Языка тропа в Oracle java учебниках.

1 голос
/ 01 мая 2020

Как упомянуто @Abra проблема с дженериками. Вы можете использовать обобщенные элементы в своем коде для решения вашей проблемы.

Создайте Admin класс как обобщенный c класс и создайте printList метод с аргументом List<T> list, чтобы он принимал любой тип объекта , например, человек, сотрудник, студент и т. д. c.

Это всего лишь пример, поэтому, пожалуйста, измените свой код соответствующим образом.

public class Admin<T> {

  public void printList(List<T> list) {
   // Print list here
  }
}
    Statics stat = new Statics();
    Admin admin = new Admin<Student>();

    // Students
    admin.printList(stat.getStudents());
    // Employees
    admin.printList(stat.getEmployees());
    // People
    admin.printList(stat.getPeople());
1 голос
/ 01 мая 2020

Изменить printList подпись метода на:

public void printList(ArrayList<? extends Person> people)

Объяснение :

Изменение подписи позволит вам передать ArrayList, параметризованный Person или его подклассы.

В java конструкция ? extends T известна как Верхний ограниченный шаблон .

При использовании people внутри printList Методом вы сможете «потреблять» (get) людей из списка (но не «производить» (add) их). «Потреблять» и «производить» здесь означают PECS .


Для получения дополнительной информации о дженериках см. Обобщения (учебник Java)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...