Java-Generics: Verwenden Sie diesen Typ als Rückgabetyp?

8

Ich versuche, eine API so benutzerfreundlich wie möglich zu machen.

Lass uns:

%Vor%

Jetzt das

%Vor%

ist ungültig, muss gegossen werden:

%Vor%

Gibt es eine Möglichkeit, Generics in A zu verwenden, um den Compiler auf diesen "This" -Typ aufmerksam zu machen und den ersten Weg zu akzeptieren - ohne Casting und ohne Übergabe des Typparameters an der Stelle, an der er verwendet wurde? (Ie. nicht new B<B>().setX() , das ist hässlich.)

ICH WEISS warum Java in diesem Fall neu eingeben muss. Bitte keine Antworten, die erklären, dass setX() A zurückgibt. Ich weiß das. Ich frage, ob Generika das lösen können.

Und für diejenigen, die mir noch sagen wollen, dass "das ist, wie statische Typisierung funktioniert" und "nicht einmal Generika können dabei helfen", bedenken Sie diesen gültigen Java-Code:

%Vor%

Sie können also sehen, dass Generika es ermöglichen, eine CCE zu erhalten, ohne dass die eigentliche Typumwandlung im Code erscheint.
Das ist der Grund, warum ich erwarte, dass Generika den expliziten Typ-Cast loswerden.

Auch IIRC C ++ erlaubt das .

    
Ondra Žižka 16.06.2013, 23:05
quelle

4 Antworten

11

Ich kopiere einen Teil des beantworte hier eine weitere Frage und erkläre den Wunsch nach dem sogenannten" Selbst-Typ "und den Workaround in Java.

Methodenverkettung

Anstatt zu schreiben

%Vor%

viele Leute würden lieber schreiben wollen

%Vor%

Leider unterstützt die Sprache nicht direkt die Verkettung von Methoden, obwohl sie immer mehr zu einem erwünschten Merkmal wird. Die Problemumgehung besteht darin, dass doA() foo zurückgibt. Es ist ein wenig schmutzig, aber akzeptabel.

Wenn sich foo jedoch in einer Typhierarchie befindet, ist die Problemumgehung unterbrochen.

%Vor%

Manche Leute fordern daher einen speziellen "Selbsttyp", um dieses Problem zu lösen. Nehmen wir an, es gibt ein Schlüsselwort This , um "Selbsttyp" zu repräsentieren

%Vor%

Es scheint, dass die Methodenverkettung der einzige Anwendungsfall für "Selbsttyp" ist, daher wird die Sprache sie wahrscheinlich nie einführen (es ist besser, die Methodenverkettung direkt zu unterstützen)

Die Leute haben herausgefunden, dass Generika eine Abhilfe für dieses Problem bieten.

%Vor%

Dies ist der beliebteste Anwendungsfall für das A extends B<A> -Muster. Es ist ein isolierter Workaround / Trick. Es fügt keine Semantik in die Beziehung zwischen A und B ein.

Es ist auch eine beliebte Vorgehensweise, This like

einzuschränken %Vor%

Es ist hässlich und nutzlos, ich empfehle dringend dagegen. Verwenden Sie einfach "Dies" als Konvention, um anzuzeigen, wofür es ist.

    
ZhongYu 16.06.2013, 23:25
quelle
4

Wenn Sie die Besetzung wirklich nicht mögen, können Sie B die Methode überschreiben lassen

%Vor%     
Bhesh Gurung 16.06.2013 23:20
quelle
3

Versuchen Sie dies in Klasse A:

%Vor%

Und du kannst es so benutzen

%Vor%     
Golyo 18.06.2014 14:19
quelle
1

Das Problem ist, dass die Methode setX() das Objekt der Klasse A zurückgibt und Sie versuchen, es in ein Objekt der Klasse B zu schreiben. Umgekehrt kann man auch ohne Casting ( A a = new B(); ) arbeiten, aber auf diese Weise müssen Sie es umwandeln, weil die Anweisung B b = new B().setX(); ähnlich wie B b = new A(); ist, was nicht möglich ist.

    
Misa Lazovic 16.06.2013 23:13
quelle

Tags und Links