Menu
Coddy logo textTech

Powtórzenie – kontener generyczny

Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 58 z 87.

challenge icon

Wyzwanie

Łatwy

Zbudujmy wszechstronny system przechowywania danych, który łączy wszystko, czego nauczyłeś się o typach generycznych! Utworzysz klasę Container, która może przechowywać, pobierać i przetwarzać elementy dowolnego typu, a także metody pomocnicze demonstrujące działanie symboli wieloznacznych.

Rozmieścisz swój kod w trzech plikach:

  • Container.java: Utwórz klasę generyczną Container<T>, która zarządza kolekcją elementów. Kontener powinien wewnętrznie używać ArrayList<T> do przechowywania elementów. Dodaj metody add(T item) do dodawania elementu, get(int index) do pobierania elementu z określonej pozycji, size() do zwracania liczby elementów oraz isEmpty() do sprawdzania, czy kontener nie zawiera żadnych elementów. Dodaj również metodę getAll(), która zwraca wewnętrzną listę.
  • ContainerUtils.java: Utwórz klasę pomocniczą ze statycznymi metodami generycznymi działającymi na twoich kontenerach:

    printAll(Container<?> container) - Używa nieograniczonego symbolu wieloznacznego, aby wypisać wszystkie elementy dowolnego kontenera, po jednym w wierszu.

    countItems(Container<? extends Number> container) - Używa symbolu wieloznacznego z górnym ograniczeniem, aby obliczyć sumę wszystkich wartości liczbowych w kontenerze i zwrócić wynik jako double.

    addDefaults(Container<? super Integer> container) - Używa symbolu wieloznacznego z dolnym ograniczeniem, aby dodać liczby całkowite 1, 2 i 3 do dowolnego kontenera, który może przechowywać liczby całkowite.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - Metoda generyczna, która zwraca ostatni element w kontenerze lub wartość domyślną, jeśli kontener jest pusty.

  • Main.java: Połącz elementy swojego generycznego systemu kontenerów! Otrzymasz trzy dane wejściowe: słowo (String), liczbę całkowitą i liczbę zmiennoprzecinkową typu double.

    Najpierw utwórz Container<String> i dodaj do niego słowo dwa razy. Wypisz String container:, a następnie użyj printAll, aby wyświetlić jego zawartość.

    Następnie utwórz Container<Double> i dodaj do niego wartość typu double. Wypisz pusty wiersz, a następnie Number sum: [sum], używając sumValues.

    Potem utwórz Container<Number> i wywołaj dla niego addDefaults. Wypisz pusty wiersz, a następnie After adding defaults: i użyj printAll, aby wyświetlić zawartość.

    Na koniec utwórz pusty Container<Integer> i użyj getLastOrDefault, podając wprowadzoną przez siebie liczbę całkowitą jako wartość domyślną. Wypisz pusty wiersz, a następnie Last or default: [result].

Otrzymasz trzy dane wejściowe w następującej kolejności: słowo (String), liczbę całkowitą i liczbę zmiennoprzecinkową typu double.

To wyzwanie łączy klasy generyczne, metody generyczne, ograniczone parametry typów i wszystkie trzy rodzaje symboli wieloznacznych. Zwróć uwagę, jak każdy element pełni inną funkcję: klasa generyczna zapewnia bezpieczne typowo przechowywanie danych, symbole wieloznaczne z ograniczeniami umożliwiają elastyczne odczytywanie i zapisywanie, a metody generyczne oferują wielokrotnego użytku operacje dla różnych typów kontenerów!

Spróbuj swoich sił

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Wczytaj dane wejściowe
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Utwórz Container<String> i dodaj do niego słowo dwukrotnie
        // Wypisz "String container:", a następnie użyj ContainerUtils.printAll()
        
        // TODO: Utwórz Container<Double> i dodaj do niego wartość typu double
        // Wypisz pustą linię, a następnie "Number sum: [sum]", używając ContainerUtils.countItems()
        
        // TODO: Utwórz Container<Number> i wywołaj na nim ContainerUtils.addDefaults()
        // Wypisz pustą linię, a następnie "After adding defaults:" i użyj ContainerUtils.printAll()
        
        // TODO: Utwórz pusty Container<Integer>
        // Użyj ContainerUtils.getLastOrDefault() z intValue jako wartością domyślną
        // Wypisz pustą linię, a następnie "Last or default: [result]"
    }
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online