Java ArrayList различные объекты расширяют друг друга, как узнать объект, который я получил? - PullRequest
0 голосов
/ 24 апреля 2020

Так что Java не моя сильная сторона, и поэтому я застрял. Вот простое объяснение

public class UserGroup {
  protected List<User> users = new ArrayList();
  protected String name;
}

public class User {
  private String username;
}

public class Tutor extends User {
  private String subject;
}

public class Student extends User {
  private String grade;
}

Моя проблема заключается в том, если я добавлю в список вещи, которые могут быть пользователем, преподавателем или студентом, когда я получу объект позже (с помощью пешего массива), как я узнаю к какому типу объектов это относится, поэтому я знаю, есть ли у меня доступ к .grade, .subject et c?

Или я что-то упускаю полностью, я чувствую, что должен как-то здесь использовать дженерики.

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Более важный вопрос почему вы хотите знать точный тип?

Следуя принципу подстановки Лискова , если у вас есть коллекция пользовательских объектов, вы должны иметь возможность выполнять все операции над ними, не зная их типа.

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

0 голосов
/ 24 апреля 2020

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

Map<Class<?>, List<User>> map = list.stream().collect(Collectors.groupingBy(User::getClass));

Полученная карта будет выглядеть следующим образом ниже:

class com.comany.User [User{name="a"}, User{name="e"}, User{name="f"}]
class com.comany.Tutor [Tutor{name="c"}]
class com.comany.Student [Student{name="b"}, Student{name="d"}]

Доступ к конкретному списку можно получить через Map::get:

List<Tutor> tutors = map.get(Tutor.class);
0 голосов
/ 24 апреля 2020

Вы можете сделать что-то вроде этого:

User user = users.get(i);
if (user instanceof Tutor) {
  Tutor tutor = (Tutor) user;
  // tutor.subject
} else if (user instance of Student) {
  Student student = (Student) user;
  // student.grade
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...