Недопустимая ошибка прямой ссылки для статических конечных полей

Я пытаюсь скомпилировать класс 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; класс принимается компилятором.

Как это можно объяснить? Я понимаю вперед как лексическое значение после , или это какой-то особый случай, о котором я не знаю?

12
задан Adam Zalcman 23 November 2011 в 22:22
поделиться