Почему ссылка на метод может использовать не финальные переменные?
У меня было некоторое замешательство по поводу внутренних классов и лямбда-выражений, и я попытался спроситьвопрос об этом, но потом возникло другое сомнение, и, вероятно, лучше опубликовать другой вопрос, чем комментировать предыдущий.
Сразу к делу: знаю (спасибо Джон) что-то подобное не скомпилируется
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
(т.е. ссылается на старый объект). Разве это не та двусмысленность, которую мы пытаемся избежать?