Zusammenfassung – Generische Container
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 58 von 87.
Aufgabe
EinfachLassen 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 KlasseContainer<T>, die eine Sammlung von Elementen verwaltet. Ihr Container sollte intern eineArrayList<T>verwenden, um Elemente zu speichern. Fügen Sie Methoden hinzu, um ein Element mitadd(T item)hinzuzufügen,get(int index)zum Abrufen eines Elements an einer bestimmten Position,size()zur Rückgabe der Anzahl der Elemente undisEmpty(), um zu prüfen, ob der Container keine Elemente enthält. Fügen Sie außerdem eine MethodegetAll()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 alsdoublezurü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 SieString container:aus und verwenden Sie dannprintAll, 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, dannNumber sum: [sum]unter Verwendung voncountItems.Erstellen Sie dann einen
Container<Number>und rufen SieaddDefaultsdarauf auf. Geben Sie eine Leerzeile aus, dannAfter adding defaults:und verwenden SieprintAll, um den Inhalt anzuzeigen.Erstellen Sie schließlich einen leeren
Container<Integer>und verwenden SiegetLastOrDefaultmit Ihrer Integer-Eingabe als Standardwert. Geben Sie eine Leerzeile aus, dannLast 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
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem9Generics
Einführung in GenericsGenerische KlassenGenerische MethodenEingeschränkte TypparameterWildcards (?, extends, super)Zusammenfassung – Generische Container