Rückblick – Generischer Container
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 58 von 87.
Aufgabe
EinfachErstellen 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 KlasseContainer<T>, die eine Sammlung von Elementen verwaltet. Dein Container sollte intern eineArrayList<T>verwenden, um Elemente zu speichern. Füge Methoden hinzu, um mitadd(T item)ein Element hinzuzufügen, mitget(int index)ein Element an einer bestimmten Position abzurufen, mitsize()die Anzahl der Elemente zurückzugeben und mitisEmpty()zu prüfen, ob der Container keine Elemente enthält. Füge außerdem einegetAll()-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 alsdoublezurü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. GibString container:aus und verwende anschließendprintAll, 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ßendNumber sum: [sum]aus, wobei dusumValuesverwendest.Erstelle dann einen
Container<Number>und rufe daraufaddDefaultsauf. Gib eine leere Zeile und anschließendAfter adding defaults:aus und verwendeprintAll, um den Inhalt anzuzeigen.Erstelle schließlich einen leeren
Container<Integer>und verwendegetLastOrDefaultmit deiner Ganzzahl als Standardwert. Gib eine leere Zeile und anschließendLast 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
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – Zahlungssystem9Generics
Einführung in GenericsGenerische KlassenGenerische MethodenGebundene TypparameterWildcards (?, extends, super)Rückblick – Generischer ContainerÜbe selbstständig: Online-Java-Compiler