Java 包含双大括号初始值设定项的范围内没有封闭实例

Java 包含双大括号初始值设定项的范围内没有封闭实例,java,super,nested-class,array-initialization,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 publi

我有一些类彼此嵌套

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!!!
                    }
                });
            }});
        }
    }
 }
公共抽象类I
{
公共摘要int f();
}
公共类J
{
私人名单李;
公共J(名单l)
{
li=l;
}
}
公共A类//头等舱
{
private int x;//一个
公共类B扩展了J//第二类
{
公共图书馆B()
{
super(新的ArrayList()//super调用
{{//数组初始值设定项
添加(新I()//第三类
{
@凌驾
公共int f()
{

return x;//一个Java文件中不允许有两个公共类,并且文件名应该与公共类名相同。

为了测试您的代码,我创建了一个新的
测试
类,如下所示。我看不到报告的错误(使用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>
    }
}
公共类测试{
公开摘要第一类{
公共摘要int f();
}
公共类J{
私人名单李;
公共J(名单l){
li=l;
}
}
公共A类//头等舱
{
private int x;//一个
公共类B扩展了J//第二类
{
公共图书馆B(){
super(新的ArrayList()//super调用
{
{//数组初始值设定项
添加(新I()//第三类
{
@凌驾
公共int f(){

返回x;//您可以将
x
声明为
static
final
以修复作用域。双大括号hack是一种反模式,您最好不要使用它。与双大括号hack相比,使用Arrays.asList更好。但这不是这里的问题。字段x必须声明为1/作为final,静态或n在调用super(…)2/或static之前,不能在B的ctor中初始化它,我知道这完全是离题的。