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