【问题标题】:No enclosing instance is in scope with double brace initializers双括号初始值设定项的范围内没有封闭实例
【发布时间】:2016-01-18 14:42:59
【问题描述】:

我有一些类相互嵌套

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 并将其保存到另一个变量然后使用该变量也可以。

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

【问题讨论】:

  • 您可以将x 声明为staticfinal 以修复范围。
  • 双括号 hack 是一种反模式,最好不要使用它。
  • 使用 Arrays.asList 比使用双括号 hack 更好。但这不是这里的问题。字段 x 必须声明 1/ 为 final,不管是静态的还是非静态的,并且使用初始化器,因为它不能在调用 super(...) 2/ 或静态之前在 B 的 ctor 中初始化

标签: java super nested-class array-initialization


【解决方案1】:

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

【讨论】:

  • 我知道,这完全是题外话。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 2011-05-31
    • 2017-07-24
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多