Ответ 1
Публичные поля в интерфейсах не являются новыми функциями Java 8. Если вы помните, что они неявно статичны и окончательны, результаты, которые вы видите, имеют прекрасный смысл.
Являются ли переменные public members в Java 8 интерфейсом функции или побочного эффекта/дефекта реализации?
Этот вопрос относится к предварительно выпуску Java 8 build lambda-8-b50-linux-x64-26_jul_2012.tar.gz.
Java 8 представляет новые функции для интерфейсов в виде методов по умолчанию. Случайное тестирование с помощью компилятора Jambda JDK8 позволяет использовать интерфейсы этой формы:
public interface Foo {
public int foo = 0;
int foo() default { return foo; }
}
Пример типа реализации:
public class FooImpl implements Foo {
public int foo = 1;
}
Этот код следует стандартным соглашениям для переменной тени:
Foo f = new FooImpl();
System.out.println(f.foo());
System.out.println(f.foo);
System.out.println(new FooImpl().foo);
Вывод:
0
0
1
В документации (JSR 335: Lambda Expressions для языка программирования Java ™ версии 0.5.1) не упоминаются переменные-члены. Я склонен думать, что компилятор слишком терпим, но, возможно, я что-то пропустил.
Публичные поля в интерфейсах не являются новыми функциями Java 8. Если вы помните, что они неявно статичны и окончательны, результаты, которые вы видите, имеют прекрасный смысл.