У меня была некоторая путаница в отношении внутренних классов и выражения лямбда, и я попытался спросить question об этом, но потом возникло еще одно сомнение, и это вероятно лучше отправляя другой вопрос, чем комментируя предыдущий.
Прямо до сути: я знаю (спасибо Jon), что что-то вроде этого не будет компилироваться
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(); }
из-за того, как Java управляет закрытием, потому что one
не является [эффективно] окончательным и т.д.
Но тогда, почему это разрешено?
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(); }
Является ли //2
эквивалентным //1
? Разве я не во втором случае рискую "работать с устаревшей переменной"?
Я имею в виду, что в последнем случае после one = new One();
выполняется f
все еще имеет устаревшую копию one
(т.е. ссылается на старый объект). Разве это не такая двусмысленность, которую мы пытаемся избежать?