Menu
Coddy logo textTech

Итоги — Обобщенный контейнер

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 58 из 87.

challenge icon

Задание

Легко

Давайте создадим универсальную систему хранения, которая объединит все, что вы узнали о дженериках! Вы создадите класс Container, который может хранить, извлекать и обрабатывать элементы любого типа, а также вспомогательные методы, демонстрирующие работу вайлдкардов (wildcards).

Вы организуете свой код в трех файлах:

  • Container.java: Создайте универсальный класс Container<T>, который управляет коллекцией элементов. Ваш контейнер должен использовать ArrayList<T> внутри для хранения элементов. Включите методы add(T item) для добавления элемента, get(int index) для извлечения элемента в определенной позиции, size() для возврата количества элементов и isEmpty() для проверки, пуст ли контейнер. Также добавьте метод getAll(), который возвращает внутренний список.
  • ContainerUtils.java: Создайте вспомогательный класс со статическими универсальными методами для работы с вашими контейнерами:

    printAll(Container<?> container) — использует неограниченный вайлдкард для вывода всех элементов в любом контейнере, по одному в строке.

    countItems(Container<? extends Number> container) — использует вайлдкард с верхней границей для вычисления суммы всех числовых значений в контейнере, возвращая результат в виде double.

    addDefaults(Container<? super Integer> container) — использует вайлдкард с нижней границей для добавления целых чисел 1, 2 и 3 в любой контейнер, который может хранить целые числа.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) — универсальный метод, который возвращает последний элемент в контейнере или значение по умолчанию, если контейнер пуст.

  • Main.java: Объедините вашу универсальную систему контейнеров! Вы получите три входных значения: слово (String), целое число (int) и число с плавающей точкой (double).

    Сначала создайте Container<String> и добавьте в него слово дважды. Выведите "String container:", затем используйте printAll для отображения его содержимого.

    Затем создайте Container<Double> и добавьте в него значение double. Выведите пустую строку, затем "Number sum: " вместе с результатом countItems.

    Затем создайте Container<Number> и вызовите для него addDefaults. Выведите пустую строку, затем "After adding defaults:" и используйте printAll для отображения содержимого.

    Наконец, создайте пустой Container<Integer> и используйте getLastOrDefault с вашим целочисленным вводом в качестве значения по умолчанию. Выведите пустую строку, затем "Last or default: " с полученным результатом.

Вы получите три входных значения по порядку: слово (String), целое число и число с плавающей точкой (double).

Эта задача сочетает в себе универсальные классы, универсальные методы, ограниченные параметры типов и все три типа вайлдкардов. Обратите внимание, как каждая часть служит своей цели: универсальный класс обеспечивает типизированное хранение, ограниченные вайлдкарды позволяют гибко читать и записывать данные, а универсальные методы предлагают многократно используемые операции для различных типов контейнеров!

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Чтение входных данных
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Создайте Container<String> и добавьте слово дважды
        // Выведите "String container:", затем используйте ContainerUtils.printAll()
        
        // TODO: Создайте Container<Double> и добавьте значение double
        // Выведите пустую строку, затем "Number sum: [sum]", используя ContainerUtils.countItems()
        
        // TODO: Создайте Container<Number> и вызовите для него ContainerUtils.addDefaults()
        // Выведите пустую строку, затем "After adding defaults:" и используйте ContainerUtils.printAll()
        
        // TODO: Создайте пустой Container<Integer>
        // Используйте ContainerUtils.getLastOrDefault() с intValue в качестве значения по умолчанию
        // Выведите пустую строку, затем "Last or default: [result]"
    }
}

Все уроки раздела Объектно-ориентированное программирование