Следующий класс содержит переменную-член runnable
, которая инициализируется экземпляром анонимного внутреннего класса. Внутренний класс ссылается на один и тот же элемент:
class Example {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(runnable);
}
};
}
Это не проблема, если метод не выполняется до того, как член был назначен, и JLS разрешает такую ссылку.
Объявление переменной-члена теоретически может быть преобразовано в выражение лямбда следующим образом:
Runnable runnable = () -> System.out.println(runnable);
Насколько я понимаю, это функционально эквивалентно предыдущему примеру, но он отклоняется javac 1.8.0_05
со следующим сообщением об ошибке:
Error:(2, 54) java: self-reference in initializer
Хотя это утверждение верно, я не понимаю, почему это было запрещено. Было ли это намеренно запрещено, может быть, потому, что лямбда-выражения скомпилированы в разные байтовые коды, что может привести к проблемам, если это позволяет? Или просто было запрещено, потому что уже были проблемы с этими ссылками, когда они использовались в анонимных внутренних классах? Или это было непреднамеренно запрещено писателями JLS? Или это ошибка в javac
?