Menu
Coddy logo textTech

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);
challenge icon

Aufgabe

Einfach

Lass 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. Deine GiftBox<T> sollte ein privates Feld item vom Typ T und ein privates Feld wrapped (boolean) haben, das mit false beginnt. Füge einen Konstruktor hinzu, der das Geschenk entgegennimmt, eine getItem()-Methode, die das Geschenk zurückgibt, eine wrap()-Methode, die wrapped auf true setzt, und eine isWrapped()-Methode, die den Verpackungsstatus zurückgibt. Füge eine getStatus()-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. Deine Registry<K, V> sollte private Felder recipient vom Typ K und gift vom Typ V haben. Füge einen Konstruktor hinzu, der beide Werte entgegennimmt, Getter-Methoden getRecipient() und getGift() sowie eine getEntry()-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 der wrap()-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&lt;String&gt;, die die Geschenkbeschreibung enthält
        // TODO: Wickle sie mit der wrap()-Methode ein
        // TODO: Gib ihren Status mit getStatus() aus
        
        // TODO: Erstelle eine GiftBox&lt;Integer&gt;, die den Geschenkwert enthält
        // TODO: Wickle dieses nicht ein - gib seinen Status aus (sollte unwrapped anzeigen)
        
        // TODO: Erstelle eine Registry&lt;String, String&gt;, die Empfänger mit Geschenkbeschreibung paart
        // TODO: Gib den Registry-Eintrag mit getEntry() aus
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler