Was nützt es, sich selbst als Typargumente in Generika zu akzeptieren?

8

Ich habe einen Code in einer nicht verwandten Frage gesehen, aber das hat mich neugierig gemacht, da ich niemals ein solches Konstrukt mit Java Generics gesehen habe. Was wäre die Verwendung einer generischen Klasse, die als Typ-Argument selbst oder als Abkömmlinge von sich selbst verwendet werden kann? Hier ist ein Beispiel:

%Vor%

Das erste, was mir in den Sinn kam, wäre eine Liste, die eine Liste als Parameter nimmt. Mit diesem Code fühlt sich seltsam an, wie deklariert man eine Variable vom Typ A? Rekursive Deklaration!?

Funktioniert das überhaupt? Wenn ja, hat jemand von euch das im Code gesehen? Wie wurde es verwendet?

BEARBEITEN

Tatsächlich stellt sich heraus, meine Frage ist die gleiche wie diese nur anders formuliert, aber die Antworten denn diese Frage wird mir auch antworten.

Danke auch für den Hinweis auf das Seltsam wiederkehrende Vorlagenmuster , das einen historischen Hintergrund und weitere Erläuterungen zum Thema bietet.

Dieser alte Blog-Eintrag gibt wahrscheinlich die beste Erklärung, die ich für uns Java-Leute gefunden habe.

Jetzt ist es schwer, hier eine richtige Antwort zu wählen, denn sie sind alle hilfreich, also werde ich mich für diejenige entscheiden, die am Ende das meiste Lesematerial (siehe oben) ergeben hat.

    
Newtopian 30.03.2010, 01:27
quelle

2 Antworten

3

Generika sind nicht nur für Container wie Listen. Diese Art des Parameters "extends itself" wird verwendet, damit sich die Oberklasse an Stellen wie Methoden- und Rückgabetypen auf die Unterklasse bezieht, obwohl keine tatsächliche spezifische Unterklasse verfügbar ist, wenn die Oberklasse kompiliert wird. Es ist analog zu dem seltsam wiederkehrenden Vorlagenmuster in C ++.

Eine Unterklasse Ihres Beispiels würde als

deklariert werden %Vor%

und die geerbte Methode foo() wird zu

%Vor%

Sehen Sie, wie A eine Methode definiert, die einen Foo -Parameter akzeptiert, obwohl sie nicht wirklich von Foo weiß?

Ja, so etwas ist ungewöhnlich, aber nicht unüblich: das eingebaute Enum Klasse verwendet einen ähnlichen Trick.

    
Wyzard 30.03.2010, 01:50
quelle
8

Ohne dies könnte der Parameter für die Methode foo nicht an E gebunden werden.

Wenn Sie eine Implementierung B dieser abstrakten Klasse haben, können Sie diese Methode nun erzwingen foo erfordert auch, dass ihr Parameter vom Typ B ist.

%Vor%

Ohne das müsste foo irgendeine Art von A übernehmen.

Ich stimme zu, dass die Syntax dafür weniger elegant ist.

    
Thilo 30.03.2010 01:43
quelle

Tags und Links