双括号初始值设定项不在封闭实例范围内

时间:2016-01-18 14:42:59

标签: java super nested-class array-initialization

我有一些嵌套在另一个中的类

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!!!
                    }
                });
            }});
        }
    }
 }

在这些条件下,我收到错误:&#34;错误:没有类型A的封闭实例在范围内&#34;。从此设置中删除任何元素可修复此错误。另外,使用x并将其保存到另一个变量然后使用该变量也可以。

这里发生了什么?对我来说,它似乎是编译器中的一个错误。

2 个答案:

答案 0 :(得分:0)

不允许在一个Java文件中有2个公共类,文件名应与公共类名相同。

答案 1 :(得分:0)

为了试验您的代码,我创建了一个新的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似乎也接受了这段代码。