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 .
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.
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.
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
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
Es ist hässlich und nutzlos, ich empfehle dringend dagegen. Verwenden Sie einfach "Dies" als Konvention, um anzuzeigen, wofür es ist.
Wenn Sie die Besetzung wirklich nicht mögen, können Sie B
die Methode überschreiben lassen
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.