Type-Angabe in Methodensignatur

EDIT: Abgetrennt von Methodenüberladung mit Generics - das kann ruhig eine eigene Frage sein :slight_smile:

Da hier gerade so schön über Generics diskutiert wird sei bitte folgende Frage gestattet :

Was bedeudetet die zusätzliche Type-Angabe in folgender Signatur :

public T[] someMethodName(…)

Wofür steht das erste vor dem return-Type ? Sorry das die Frage vielleicht selten dämlich rüber kommt, aber ich habe mich so leider noch nicht weiter mit Generics beschäftigt außer das ich weiß wie ich sie korrekt bei Collections nutze.

Das Bedeutet, dass der Typ nur dort definiert ist. “Normalerweise” hat man die Typparameter ja bei Klassen

class Box<T>
{
    private T content;
    public T getContent() { return content; }
    public void putContent(T t) { content = t; }
}

Aber manchmal braucht man die gar nicht, bzw. man braucht sie nur bei der Methode (oft bei statischen Utility-Methoden). Z.B. bei sowas wie

void moveContent(Box<?> source, Box<?> destination)
{
    // Geht nicht, weil die Typen ("?") unbekannt sind
    destination.setContent(source.getContent());
}

Dort kann man den Typ “einfangen”, indem man der Methode einen Typparameter gibt:

<T> void moveContent(Box<T> source, Box<T> destination)
{
    destination.setContent(source.getContent());
}

Mehr steht auch unter http://docs.oracle.com/javase/tutorial/extra/generics/methods.html

nett auch als Autocast-Funktion,
wenn man den Typ eines Objektes in einen Container kennt, notgedrungen dort allgemein als Object gespeichert

Hibernate-Query-Beispiel:

public <T> T getUnique(Query q) {
  return (T) q.unique();
}

LangerKomplizierterKlassenname x = getUnique(q);
statt
LangerKomplizierterKlassenname x = (LangerKomplizierterKlassenname) q.unique();

ob die richtige Klasse zurückkommt hängt sowieso von anderem ab, etwa der Rückgabewert vom Aufbau einer Query,
oder allgemein vom vorherigen Speichern im Container,
ob man selber castet oder es einer allgemeinen Methode überläßt, die ClassCastException wird im Fehlerfall so oder so kommen,
man kann sich 100 unschöne Codestellen einsparen