Konstruktor Methodenreferenz für (nicht-statische) innere Klasse?

8

Gibt es für die innere Klasse der äußeren Klasseninstanz etwas Ähnliches für StaticClass::new ?

Bearbeiten:

i.e. wenn ich

habe %Vor%

Ich kann Outer o = new Outer(); Inner i = o.new Inner() in altem Java machen. Wie kann ich das o.new Inner() als Funktionsreferenz ausdrücken?

    
billc.cn 11.03.2015, 09:21
quelle

3 Antworten

8

Nach den Oracle-Tutorials gibt es vier Arten von Methodenreferenzen:

  • Verweis auf eine statische Methode
    • ContainingClass::staticMethodName
  • Verweis auf eine Instanzmethode eines bestimmten Objekts
    • containingObject::instanceMethodName
  • Verweis auf eine Instanzmethode eines beliebigen Objekts eines bestimmten Typs
    • ContainingType::methodName
  • Verweis auf einen Konstruktor
    • ClassName::new

Verweise auf eine lokale / verschachtelte Klasse sind nicht aufgelistet, daher würde ich annehmen, dass sie nicht unterstützt wird.

Sie können das java.util.function.Supplier auslösen die Verwendung von lambdas, um eine Instanz der geschachtelten Klasse zu erhalten:

%Vor%     
Konstantin Yovkov 11.03.2015, 09:47
quelle
3

Das Kapitel 15.13. Method Reference Expressions in der JLS enthält eine etwas kryptische Aussage dazu:

  

Die unmittelbar umschließende Instanz einer neuen inneren Klasseninstanz ( §15.9.2 ) wird von einer lexikalisch umschließenden Instanz von this bereitgestellt ( §8.1.3 ).

Dies bedeutet grundsätzlich, dass eine Methodenreferenz auf den Konstruktor einer inneren Klasse möglich ist in eine Methode der äußeren Klasse, wie in diesem Beispiel

%Vor%

Aber die JLS erwähnt keine Alternative, daher muss man annehmen, dass es einfach nicht möglich ist, die umschließende Instanz in einer anderen Form als this bereitzustellen.

    
Marco13 11.03.2015 10:48
quelle
0

Für eine statische geschachtelte Klasse können Sie mit der äußeren Klasse - OuterClass.NestedClass::new :

darauf verweisen %Vor%

Für die innere Klasse (geschachtelte nicht statische Klasse) können Sie outerInstanceName.new InnerClass(...) :

verwenden %Vor%

Meine IDE schlägt mir vor, x -> a.new B(x) in A.B::new zu konvertieren, aber das kompiliert nicht, weil B nicht statisch ist - es gehört nicht zur Klasse A , sondern zur Instanz der Klasse A . Also beantworte deine Frage - ich denke es ist nicht möglich und du musst outerInstanceName.new InnerClass(...) verwenden.

    
Jaroslaw Pawlak 11.03.2015 09:35
quelle

Tags und Links