Generische Methoden
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 55 von 87.
Während generische Klassen dafür sorgen, dass ganze Klassen mit unterschiedlichen Typen arbeiten können, benötigen Sie manchmal nur eine einzige Methode, die generisch ist. Eine generische Methode deklariert ihren eigenen Typparameter, unabhängig von generischen Parametern auf Klassenebene.
Der Typparameter steht in der Methodensignatur vor dem Rückgabetyp:
public class Utility {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
String[] names = {"Alice", "Bob"};
Integer[] numbers = {1, 2, 3};
Utility.printArray(names); // Funktioniert mit String[]
Utility.printArray(numbers); // Funktioniert mit Integer[]Beachte <T>, das zwischen den Modifikatoren und dem Rückgabetyp steht. Dadurch wird T als Typparameter für diese bestimmte Methode deklariert. Der Compiler leitet den tatsächlichen Typ aus den Argumenten ab, die du übergibst.
Generische Methoden können auch den generischen Typ zurückgeben:
public static <T> T getFirst(T[] array) {
if (array.length > 0) {
return array[0];
}
return null;
}
String first = getFirst(new String[]{"a", "b"}); // Gibt "a" zurückBei Bedarf kannst du mehrere Typparameter verwenden:
public static <K, V> void printPair(K key, V value) {
System.out.println(key + ": " + value);
}
printPair("Age", 25); // String und Integer
printPair(1, "First"); // Integer und StringGenerische Methoden sind besonders nützlich in Hilfsklassen, wenn du flexible, wiederverwendbare Operationen benötigst, ohne eine generische Klasse zu erstellen.
Aufgabe
EinfachErstellen wir ein Utility-Toolkit, das die Flexibilität generischer Methoden demonstriert. Du erstellst eine Klasse mit wiederverwendbaren Methoden, die mit jedem Typ funktionieren, und zeigst dabei, wie generische Methoden unabhängig von generischen Klassen existieren können.
Du organisierst deinen Code über zwei Dateien:
ArrayUtils.java: Erstelle eine Utility-Klasse mit generischen Methoden für die Arbeit mit Arrays. Deine Klasse soll drei statische generische Methoden enthalten:getLast– Eine generische Methode, die ein Array vom TypTentgegennimmt und das letzte Element zurückgibt. Wenn das Array leer ist, gibnullzurück.swap– Eine generische Methode, die ein Array vom TypTund zwei ganzzahlige Indizes entgegennimmt und anschließend die Elemente an diesen Positionen vertauscht. Diese Methode gibt nichts zurück.printWithLabel– Eine generische Methode mit zwei TypparameternKundV. Sie nimmt ein Label vom TypKund einen Wert vom TypVentgegen und gibt sie anschließend im Format[label]: [value]aus.Main.java: Setze deine generischen Methoden ein! Du erhältst vier Eingaben: zwei Wörter (Strings) und zwei Zahlen (Ganzzahlen).Erstelle zunächst ein
String[]-Array, das beide Wörter enthält. VerwendegetLast, um das letzte Element abzurufen, und gib Folgendes aus:Last word: [result]Erstelle als Nächstes ein
Integer[]-Array, das beide Zahlen enthält. Rufeswapauf, um die Elemente an den Indizes 0 und 1 zu vertauschen, und gib anschließend Folgendes aus:After swap: [first], [second]Demonstriere schließlich die generische Methode mit zwei Parametern, indem du
printWithLabelzweimal aufrufst:- Einmal mit dem ersten Wort als Label und der ersten Zahl als Wert
- Einmal mit der ersten Zahl als Label und dem zweiten Wort als Wert
Du erhältst vier Eingaben in dieser Reihenfolge: erstes Wort, zweites Wort, erste Zahl, zweite Zahl.
Beachte, wie jede Methode ihren eigenen Typparameter mit <T> oder <K, V> vor dem Rückgabetyp deklariert. Der Compiler leitet die tatsächlichen Typen aus den Argumenten ab, die du übergibst: Du musst sie beim Aufrufen der Methoden nicht ausdrücklich angeben!
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String firstWord = scanner.nextLine();
String secondWord = scanner.nextLine();
int firstNumber = scanner.nextInt();
int secondNumber = scanner.nextInt();
// TODO: Erstelle ein String[]-Array, das beide Wörter enthält
// TODO: Verwende ArrayUtils.getLast, um das letzte Element zu erhalten
// Ausgabe: "Last word: [result]"
// TODO: Erstelle ein Integer[]-Array, das beide Zahlen enthält
// TODO: Rufe ArrayUtils.swap auf, um die Elemente an den Indizes 0 und 1 zu tauschen
// Ausgabe: "After swap: [first], [second]"
// TODO: Rufe ArrayUtils.printWithLabel mit firstWord als label und firstNumber als value auf
// TODO: Rufe ArrayUtils.printWithLabel mit firstNumber als label und secondWord als value auf
}
}
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