Warum kann eine Methodenreferenz nicht endgültige Variablen verwenden?
Ich hatte einige Verwirrung über innere Klassen und Lambda-Ausdruck, und ich versuchte, ein @ zu fragFrag darüber, aber dann kam ein weiterer Zweifel auf, und es ist wahrscheinlich besser, eine andere Frage zu stellen, als die vorherige zu kommentieren.
Straight to the point: Ich weiß danke Jon) dass so etwas nicht kompiliert
public class Main {
public static void main(String[] args) {
One one = new One();
F f = new F(){ //1
public void foo(){one.bar();} //compilation error
};
one = new One();
}
}
class One { void bar() {} }
interface F { void foo(); }
aufgrund der Art und Weise, wie Java Schließungen verwaltet, weilone
ist nicht [effektiv] final und so weiter
Aber wie kommt es, dass das erlaubt ist?
public class Main {
public static void main(String[] args) {
One one = new One();
F f = one::bar; //2
one = new One();
}
}
class One { void bar() {} }
interface F { void foo(); }
Ist nicht//2
gleichwertig//1
? Bin ich im zweiten Fall nicht mit dem Risiko konfrontiert, "mit einer veralteten Variablen zu arbeiten"?
Ich meine, im letzteren Fall nachone = new One();
wird ausgeführtf
habe noch eine veraltete Kopie vonone
(d. h. verweist auf das alte Objekt). Ist das nicht die Art von Zweideutigkeit, die wir vermeiden wollen?