【发布时间】: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声明为static或final以修复范围。 -
双括号 hack 是一种反模式,最好不要使用它。
-
使用 Arrays.asList 比使用双括号 hack 更好。但这不是这里的问题。字段 x 必须声明 1/ 为 final,不管是静态的还是非静态的,并且使用初始化器,因为它不能在调用 super(...) 2/ 或静态之前在 B 的 ctor 中初始化
标签: java super nested-class array-initialization