Я пытаюсь скомпилировать 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;
, класс принимается компилятором.
Как это можно объяснить? Является ли мое понимание прямого слова лексически ошибочным или это какой-то частный случай, о котором я не знаю?