Обновление: это более или менее dupe, и оказывается, что это магия компилятора, добавляющая конструктор для передачи локальной переменной в build2.
Учитывая такой интерфейс:
public interface IFoo {
public int get();
}
Приведенный ниже код выводит 1, 1, 2, а затем выдает исключение при попытке вызвать getClass().newInstance() для значения, возвращаемого build2, но не при вызове того же самого для возвращаемого значения build1. Есть идеи, почему?
public class Foo {
public static IFoo build1() {
return new IFoo() { public int get() { return 1; } };
}
public static IFoo build2(final int v) {
return new IFoo() { public int get() {return v;} };
}
public static void main(String[] args) throws Exception {
IFoo foo, bar;
foo = build1();
System.out.println(foo.get());
bar = foo.getClass().newInstance();
System.out.println(bar.get());
foo = build2(2);
System.out.println(foo.get());
bar = foo.getClass().newInstance();
System.out.println(bar.get());
}
}
Мой отладчик указывает, что в вызове newInstance() getConstructor0 генерирует исключение NoSuchMethodException.