Generische Klassen
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 54 von 87.
Da du nun verstehst, warum Generics nützlich sind, erstellen wir jetzt deine eigene generische Klasse. Eine generische Klasse deklariert einen oder mehrere Typparameter in spitzen Klammern nach dem Klassennamen, die dann in der gesamten Klasse verwendet werden können.
class Box<T> {
private T content;
public void set(T content) {
this.content = content;
}
public T get() {
return content;
}
}Das T ist ein Typparameter: ein Platzhalter, der durch einen tatsächlichen Typ ersetzt wird, wenn du eine Instanz erstellst. Du kannst jeden Namen verwenden, aber einzelne Großbuchstaben sind üblich: T für Type, E für Element, K für Key, V für Value.
Beim Instanziieren einer generischen Klasse gibst du den tatsächlichen Typ in spitzen Klammern an:
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // Kein Casting nötig
Box<Integer> intBox = new Box<>();
intBox.set(42);
Integer num = intBox.get();Beachte den <> (Diamantoperator) auf der rechten Seite: Java leitet den Typ aus der Deklaration ab. Du kannst auch mehrere Typparameter für Klassen verwenden, die mit mehr als einem Typ arbeiten müssen:
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() { return key; }
public V getValue() { return value; }
}
Pair<String, Integer> pair = new Pair<>("age", 25);Aufgabe
EinfachLass uns ein Geschenkelisten-System erstellen, das die Leistungsfähigkeit generischer Klassen demonstriert. Du erstellst ein flexibles Speichersystem, das Geschenkartikel beliebigen Typs aufnehmen kann, sowie eine Liste, die Geschenknamen mithilfe mehrerer Typparameter mit ihren Details verknüpft.
Du organisierst deinen Code über drei Dateien:
GiftBox.java: Erstelle eine generische Klasse, die Geschenke beliebigen Typs verpacken kann. DeineGiftBox<T>sollte ein privates Felditemvom TypTund ein privates Feldwrapped(boolean) haben, das mitfalsebeginnt. Füge einen Konstruktor hinzu, der das Geschenk entgegennimmt, einegetItem()-Methode, die das Geschenk zurückgibt, einewrap()-Methode, die wrapped auf true setzt, und eineisWrapped()-Methode, die den Verpackungsstatus zurückgibt. Füge einegetStatus()-Methode hinzu, die abhängig vom Verpackungsstatus entweder[item] (wrapped)oder[item] (unwrapped)zurückgibt.Registry.java: Erstelle eine generische Klasse mit zwei Typparametern, die eine empfangende Person mit ihrem Geschenk verknüpft. DeineRegistry<K, V>sollte private Felderrecipientvom TypKundgiftvom TypVhaben. Füge einen Konstruktor hinzu, der beide Werte entgegennimmt, Getter-MethodengetRecipient()undgetGift()sowie einegetEntry()-Methode, die Folgendes zurückgibt:[recipient] -> [gift]Main.java: Erwecke deine Geschenkeliste zum Leben! Du erhältst drei Eingaben: einen Namen der empfangenden Person (String), eine Geschenkbeschreibung (String) und einen Geschenkewert (Ganzzahl, die Dollar repräsentiert).Erstelle zuerst eine
GiftBox<String>, die die Geschenkbeschreibung enthält. Verpacke sie mithilfe derwrap()-Methode und gib anschließend ihren Status aus.Erstelle als Nächstes eine
GiftBox<Integer>, die den Geschenkewert enthält (der einen Geschenkkartenbetrag repräsentiert). Verpacke diese nicht: Gib ihren Status aus, um zu zeigen, dass sie unverpackt ist.Erstelle schließlich eine
Registry<String, String>, die den Namen der empfangenden Person mit der Geschenkbeschreibung verknüpft, und gib den Listeneintrag aus.
Du erhältst drei Eingaben in dieser Reihenfolge: Name der empfangenden Person, Geschenkbeschreibung und Geschenkewert (als Ganzzahl).
Beachte, wie dieselbe GiftBox-Klasse nahtlos mit den Typen String und Integer funktioniert: Das ist die Stärke von Generics! Und die Registry-Klasse zeigt, wie du mit mehreren Typparametern flexible Zuordnungen zwischen beliebigen zwei Typen erstellen kannst.
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String recipientName = scanner.nextLine();
String giftDescription = scanner.nextLine();
int giftValue = scanner.nextInt();
// TODO: Erstelle eine GiftBox<String>, die die Geschenkbeschreibung enthält
// TODO: Wickle sie mit der wrap()-Methode ein
// TODO: Gib ihren Status mit getStatus() aus
// TODO: Erstelle eine GiftBox<Integer>, die den Geschenkwert enthält
// TODO: Wickle dieses nicht ein - gib seinen Status aus (sollte unwrapped anzeigen)
// TODO: Erstelle eine Registry<String, String>, die Empfänger mit Geschenkbeschreibung paart
// TODO: Gib den Registry-Eintrag mit getEntry() aus
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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 – ZahlungssystemÜbe selbstständig: Online-Java-Compiler