Ich bin etwas verwirrt mit dem unterschiedlichen Verhalten einer anonymen Klasse und eines Lambda-Ausdrucks.
Wenn ich einen Lambda-Ausdruck verwende:
%Vor%Bei Verwendung einer anonymen Klasse:
%Vor%Kann jemand bitte das unterschiedliche Verhalten erklären?
In einem Lambda-Ausdruck ist this
lexikalisch an die umgebende Klasse gebunden, während in der anonymen Klasse this
lexikalisch an die anonyme Klasse gebunden ist.
Die Java-Sprachspezifikation beschreibt dieses Verhalten unter 15.27 .2 :
Im Gegensatz zu Code, der in anonymen Klassendeklarationen angezeigt wird, sind die Bedeutung von Namen und die in einem Lambda-Body auftretenden Schlüsselwörter
this
undsuper
sowie die Zugriffsmöglichkeit für referenzierte Deklarationen identisch mit denen im umgebenden Kontext Lambda-Parameter führen neue Namen ein).Die Transparenz von
this
(sowohl explizit als auch implizit) im Body eines Lambda-Ausdrucks - das heißt, sie genauso behandeln wie im umgebenden Kontext - ermöglicht mehr Flexibilität für Implementierungen und verhindert die Bedeutung von unqualifizierte Namen im Körper, die von der Überladungsauflösung abhängig sind.In der Praxis ist es ungewöhnlich, dass ein Lambda-Ausdruck über sich selbst sprechen muss (entweder um sich rekursiv zu nennen oder um andere Methoden aufzurufen), während es eher üblich ist, Namen zu verwenden, um auf Dinge zu verweisen in der umschließenden Klasse, die andernfalls beschattet würde (
this
,toString()
). Wenn es erforderlich ist, dass ein Lambda-Ausdruck auf sich selbst verweist (wie überthis
), sollte stattdessen eine Methodenreferenz oder eine anonyme innere Klasse verwendet werden.
Um auf this
der umgebenden Klasse innerhalb einer anonymen Klasse zu verweisen, müssen Sie ein qualifiziert this
.
Tags und Links java java-8 lambda anonymous-class