Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Дженерики Java: Коллекции

Класс Entry

public class Entry {
    private Object value1;
    private Object value2;

    public Entry(Object value1, Object value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    public Object getValue1() {
        return value1;
    }

    public Object getValue2() {
        return value2;
    }
}
Entry entry = new Entry(1, "Egor");
System.out.println(entry.getValue1()); // 1
System.out.println(entry.getValue2()); // "Egor"

String name = entry.getValue2();
System.out.println("User's name is = " + name);
// => java.lang.Object cannot be converted to java.lang.String

Класс IntegerStringEntry

public class IntegerStringEntry {
    private int value1;
    private String value2;

    public IntegerStringEntry(int value1, String value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    public int getValue1() {
        return value1;
    }

    public String getValue2() {
        return value2;
    }
}
IntegerStringEntry integerStringEntry = new IntegerStringEntry(1, "Max");
String name = integerStringEntry.getValue2(); // "Max"
int id = integerStringEntry.getValue1(); // 1

System.out.println("User with id = " + id + " has name = " + name);
// => User with id = 1 has name = Max

Решение проблемы в Java

public class GEntry<T> {
    private int value1;
    private T value2;

    public GEntry(int value1, T value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    public int getValue1() {
        return value1;
    }

    public T getValue2() {
        return value2;
    }
}
GEntry<String> gEntry = new GEntry<>(1, "Egor");
String name = gEntry.getValue2();
System.out.println("Name from generic is = " + name);
// => Name from generic is = Egor

// работает и для классов, которые мы создадим потом,
// в отличие от boilerplate-ов
Date egorBirthDate = new Date(-1000000L);
User user = new User("Egor", egorBirthDate);
GEntry<User> userGEntry = new GEntry<>(1, user);

System.out.println(userGEntry.getValue1()); // => 1

User egor = userGEntry.getValue2();

Методы

public class Util {
    /**
     * Никто не запрещает передавать List (любую коллекцию) в качестве аргумента метода.
     * @param users
     * @return users amount
     */
    public static int getAmountOfUsers(List<User> users) {
        return users.size();
    }

    public static int getAmountOfBooks(Map<String, List<String>> map) {
        int result = 0;
        for (Map.Entry<String, List<String>> authorAndBooks: map.entrySet()) {
            result = result + authorAndBooks.getValue().size();
        }
        return result;
    }

    /**
     * Нельзя без <T>.
     * Обощенные классы - это хорошо, но что если нам в одном классе нужны разные generics
     * @param list
     * @param element
     * @param <T>
     * @return element index
     */
    public static <T> int findElementIndex(List<T> list, T element) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals(element)) {
                return i;
            }
        }
        return 0;
    }
}
List<User> users = new ArrayList<>();
users.add(new User("Egor", new Date()));
users.add(new User("Max", new Date(-10000L)));

Util.getAmountOfUsers(users); // 2

Map<String, List<String>> authorAndBooksMap = new HashMap<>();
List<String> booksPushkin = new ArrayList<>();
booksPushkin.add("Золотая рыбка");
booksPushkin.add("Евгений Онегин");

authorAndBooksMap.put("Пушкин", booksPushkin);

List<String> booksTolstoy = new ArrayList<>();
booksPushkin.add("Война и мир");
booksPushkin.add("Анна Каренина");

authorAndBooksMap.put("Толстой", booksTolstoy);

System.out.println(
    "Всего мы храним " + Util.getAmountOfBooks(authorAndBooksMap) + " книг"
);
// => Всего мы храним 4 книг
// Обобщенные методы
List<User> userList = new ArrayList<>();
User user1 = new User("Egor", new Date());
User user2 = new User("Boris", new Date());
userList.add(user1);
userList.add(user2);

//int index= Util.<User>findElementIndex(userList, user2);
int index = Util.findElementIndex(userList, user2);
System.out.println("Index of user2 is: " + index);
// => Index of user2 is: 1

Домашнее задание

Загрузите домашнее задание с помощью команды:

hexlet program download java generics

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
7 июля 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу