В области действия нет включающего экземпляра с инициализаторами с двойной скобкой

У меня есть несколько классов, вложенных друг в друга

public abstract class I
{
    public abstract int f();
}

public class J
{
    private List<I> li;
    public J(List<I> l)
    {
        li = l;
    }
}

public class A // first class
{
    private int x; // field of A
    public class B extends J // second class
    {
        public B()
        {
            super(new ArrayList<I>() // super call
            {{ // array initializer
                add(new I() // third class
                {
                    @Override
                    public int f()
                    {
                        return x; // <- here!!!
                    }
                });
            }});
        }
    }
 }

В этих условиях я получаю сообщение об ошибке: "ошибка: ни один экземпляр типа A не находится в области видимости". Удаление любого элемента из этой установки исправляет эту ошибку. Также работает x и сохранение его в другой переменной, затем использование этой переменной.

Что здесь происходит? Это похоже на ошибку в компиляторе для меня.

2 ответа

Не разрешается иметь 2 открытых класса в одном Java-файле, и имя файла должно совпадать с именем открытого класса.

Чтобы поэкспериментировать с вашим кодом, я сделал новый Test класс как это. Я не вижу сообщений об ошибках (используя Java 8). Возможно, это проблема сборки.

public class Test {

    public abstract class I {

        public abstract int f();
    }

    public class J {

        private List<I> li;

        public J(List<I> l) {
            li = l;
        }
    }

    public class A // first class
    {

        private int x; // field of A

        public class B extends J // second class
        {

            public B() {
                super(new ArrayList<I>() // super call
                {
                    { // array initializer
                        add(new I() // third class
                        {
                            @Override
                            public int f() {
                                return x; // <- here!!!
                            }
                        });
                    }
                });
            }
        }
    }

    public void test() {
        System.out.println("Hello");
    }

    public static void main(String args[]) {
        //<editor-fold defaultstate="collapsed" desc="test">
        try {
            new Test().test();
        } catch (Throwable t) {
            t.printStackTrace(System.err);
        }
        //</editor-fold>
    }
}

Java 7 также, кажется, принимает этот код.

Другие вопросы по тегам