В области действия нет включающего экземпляра с инициализаторами с двойной скобкой
У меня есть несколько классов, вложенных друг в друга
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 и сохранение его в другой переменной, затем использование этой переменной.
Что здесь происходит? Это похоже на ошибку в компиляторе для меня.
2 ответа
Не разрешается иметь 2 открытых класса в одном Java-файле, и имя файла должно совпадать с именем открытого класса.
Чтобы поэкспериментировать с вашим кодом, я сделал новый 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 также, кажется, принимает этот код.