Я пытаюсь скомпилировать класс Java, который javac
отклоняет с ошибкой недопустимой прямой ссылки , где оскорбительная ссылка лексически ] после указанного поля. Следующий класс максимально урезан, но при этом демонстрирует то же поведение:
java.util.concurrent.Callable
и множество применений Object
просто используются в качестве заполнителей для удаления нерелевантных частей. кода.
public class Test {
static final Object foo = method(new java.util.concurrent.Callable<Object>() {
@Override
public Object call() throws Exception {
return bar;
}
});
static final Object bar = foo;
static Object method(Object binder) {
return null;
}
}
При компиляции с использованием javac Test.java
, javac выводит следующее сообщение об ошибке:
Test.java:9: illegal forward reference
static final Object bar = foo;
^
Итак, компилятор жалуется на объявление bar
, ссылающееся на foo
, тогда как foo
должно быть в объем объявления bar
. Но как только ссылка на bar
в объявлении foo
будет удалена, например изменив строку 5 с return bar;
на return null;
класс принимается компилятором.
Как это можно объяснить? Я понимаю вперед как лексическое значение после , или это какой-то особый случай, о котором я не знаю?