Menu
Coddy logo textTech

Zusammenfassung – Generische Container

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 58 von 87.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein vielseitiges Speichersystem bauen, das alles vereint, was Sie über Generics gelernt haben! Sie werden eine Container-Klasse erstellen, die Elemente eines beliebigen Typs speichern, abrufen und verarbeiten kann, zusammen mit Hilfsmethoden, die Wildcards in Aktion demonstrieren.

Sie werden Ihren Code über drei Dateien organisieren:

  • Container.java: Erstellen Sie eine generische Klasse Container<T>, die eine Sammlung von Elementen verwaltet. Ihr Container sollte intern eine ArrayList<T> verwenden, um Elemente zu speichern. Fügen Sie Methoden hinzu, um ein Element mit add(T item) hinzuzufügen, get(int index) zum Abrufen eines Elements an einer bestimmten Position, size() zur Rückgabe der Anzahl der Elemente und isEmpty(), um zu prüfen, ob der Container keine Elemente enthält. Fügen Sie außerdem eine Methode getAll() hinzu, die die interne Liste zurückgibt.
  • ContainerUtils.java: Erstellen Sie eine Hilfsklasse mit statischen generischen Methoden, die mit Ihren Containern arbeiten:

    printAll(Container<?> container) - Verwendet eine ungebundene Wildcard (unbounded wildcard), um alle Elemente in einem beliebigen Container auszugeben, eines pro Zeile.

    countItems(Container<? extends Number> container) - Verwendet eine nach oben begrenzte Wildcard (upper bounded wildcard), um die Summe aller numerischen Werte im Container zu berechnen und das Ergebnis als double zurückzugeben.

    addDefaults(Container<? super Integer> container) - Verwendet eine nach unten begrenzte Wildcard (lower bounded wildcard), um die Ganzzahlen 1, 2 und 3 zu jedem Container hinzuzufügen, der Ganzzahlen aufnehmen kann.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - Eine generische Methode, die das letzte Element im Container zurückgibt oder den Standardwert, wenn der Container leer ist.

  • Main.java: Bringen Sie Ihr generisches Containersystem zusammen! Sie erhalten drei Eingaben: ein Wort (String), eine Ganzzahl (Integer) und eine Gleitkommazahl (Double).

    Erstellen Sie zuerst einen Container<String> und fügen Sie das Wort zweimal hinzu. Geben Sie String container: aus und verwenden Sie dann printAll, um den Inhalt anzuzeigen.

    Erstellen Sie als Nächstes einen Container<Double> und fügen Sie den Double-Wert hinzu. Geben Sie eine Leerzeile aus, dann Number sum: [sum] unter Verwendung von countItems.

    Erstellen Sie dann einen Container<Number> und rufen Sie addDefaults darauf auf. Geben Sie eine Leerzeile aus, dann After adding defaults: und verwenden Sie printAll, um den Inhalt anzuzeigen.

    Erstellen Sie schließlich einen leeren Container<Integer> und verwenden Sie getLastOrDefault mit Ihrer Integer-Eingabe als Standardwert. Geben Sie eine Leerzeile aus, dann Last or default: [result].

Sie erhalten drei Eingaben in der folgenden Reihenfolge: ein Wort (String), eine Ganzzahl (Integer) und eine Gleitkommazahl (Double).

Diese Herausforderung kombiniert generische Klassen, generische Methoden, begrenzte Typparameter und alle drei Wildcard-Typen. Beachten Sie, wie jeder Teil einem anderen Zweck dient: Die generische Klasse bietet typsicheren Speicher, begrenzte Wildcards ermöglichen flexibles Lesen und Schreiben, und generische Methoden bieten wiederverwendbare Operationen über verschiedene Containertypen hinweg!

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Eingaben lesen
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Erstelle einen Container<String> und füge das Wort zweimal hinzu
        // Gib "String container:" aus und verwende dann ContainerUtils.printAll()
        
        // TODO: Erstelle einen Container<Double> und füge den double-Wert hinzu
        // Gib eine Leerzeile aus, dann "Number sum: [sum]" unter Verwendung von ContainerUtils.countItems()
        
        // TODO: Erstelle einen Container<Number> und rufe ContainerUtils.addDefaults() darauf auf
        // Gib eine Leerzeile aus, dann "After adding defaults:" und verwende ContainerUtils.printAll()
        
        // TODO: Erstelle einen leeren Container<Integer>
        // Verwende ContainerUtils.getLastOrDefault() mit intValue als Standardwert
        // Gib eine Leerzeile aus, dann "Last or default: [result]"
    }
}

Alle Lektionen in Objektorientierte Programmierung