Sagen wir, ich habe den folgenden Code:
%Vor% Wie kann ich getIterable
der äußeren Klasse von der inneren Klasse mit dem gleichen Namen referenzieren?
MyStream.this
sollte hier auf die innere Klasse zeigen, oder? Wie zeige ich eine äußere Klasse mit demselben Namen an?
Wenn Sie MyStream.this
von der anonymen Klasse aufrufen, zeigt es auf die äußere Klasse, so dass der folgende Code wie erwartet funktionieren sollte:
(falls nicht, würden Sie einen StackOverflowError erhalten).
Der Grund, warum es funktioniert, ist Eine anonyme Klasse ist eine innere Klasse .
Vereinfachtes Beispiel, das outer 1
ausgibt:
MyStream.this
zeigt nicht auf die innere Klasse. Die innere Klasse ist anonym . Es kann Sie verwirren, weil Sie new MyStream() {...}
verwendet haben, aber tatsächlich ist es eine neue innere Klasse, die einen internen Namen hat, und die new MyStream() {...}
-Syntax dient lediglich dazu, die SomeClass extends MyStream
-Syntax zu ersetzen.
Es ist erwähnenswert, dass die innere Klasse sowohl erweitert MyClass
als auch geschachtelt darin ist. Dies bedeutet, dass sowohl super
und MyClass.this
vorhanden sind als auch MyClass
Referenzen, aber sie sind zwei unterschiedliche Objektinstanzen. super
zeigt auf die innere Klasseninstanz selbst, sieht aber so aus, als wäre es MyClass
, während MyClass.this
das umschließende Objekt ist.
Tags und Links java