Menu
Coddy logo textTech

Rückblick – Generischer Container

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

challenge icon

Aufgabe

Einfach

Erstellen wir ein vielseitiges Speichersystem, das alles zusammenführt, was du über Generics gelernt hast! Du erstellst eine Container-Klasse, die Elemente beliebigen Typs speichern, abrufen und verarbeiten kann, sowie Hilfsmethoden, die Wildcards in Aktion demonstrieren.

Du organisierst deinen Code über drei Dateien:

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

    printAll(Container<?> container) – Verwendet eine unbeschränkte Wildcard, um alle Elemente in einem beliebigen Container jeweils in einer eigenen Zeile auszugeben.

    countItems(Container<? extends Number> container) – Verwendet eine obere Wildcard-Beschränkung, um die Summe aller numerischen Werte im Container zu berechnen und das Ergebnis als double zurückzugeben.

    addDefaults(Container<? super Integer> container) – Verwendet eine untere Wildcard-Beschränkung, 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 oder den Standardwert zurückgibt, wenn der Container leer ist.

  • Main.java: Führe dein generisches Containersystem zusammen! Du erhältst drei Eingaben: ein Wort (String), eine Ganzzahl und eine Gleitkommazahl.

    Erstelle zunächst einen Container<String> und füge das Wort zweimal hinzu. Gib String container: aus und verwende anschließend printAll, um seinen Inhalt anzuzeigen.

    Erstelle als Nächstes einen Container<Double> und füge ihm den Double-Wert hinzu. Gib eine leere Zeile und anschließend Number sum: [sum] aus, wobei du sumValues verwendest.

    Erstelle dann einen Container<Number> und rufe darauf addDefaults auf. Gib eine leere Zeile und anschließend After adding defaults: aus und verwende printAll, um den Inhalt anzuzeigen.

    Erstelle schließlich einen leeren Container<Integer> und verwende getLastOrDefault mit deiner Ganzzahl als Standardwert. Gib eine leere Zeile und anschließend Last or default: [result] aus.

Du erhältst drei Eingaben in dieser Reihenfolge: ein Wort (String), eine Ganzzahl und eine Gleitkommazahl.

Diese Herausforderung verbindet generische Klassen, generische Methoden, beschränkte Typparameter und alle drei Wildcard-Typen. Beachte, wie jedes Element einen unterschiedlichen Zweck erfüllt: Die generische Klasse ermöglicht typsichere Speicherung, beschränkte Wildcards erlauben flexibles Lesen und Schreiben, und generische Methoden bieten wiederverwendbare Operationen für verschiedene Containertypen!

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

Übe selbstständig: Online-Java-Compiler