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中初始化它,我知道这完全是离题的。