Wert von "this" in einer anonymen Klasse gegen einen Lambda-Ausdruck

8

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?

    
Mehraj Malik 27.02.2017, 06:32
quelle

1 Antwort

10

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 und super 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 über this ), 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 .

%Vor%     
4castle 27.02.2017, 06:43
quelle