Java 8(预发布)接口成员变量

McD*_*ell 16 java java-8

Java 8中的公共成员变量是特征还是实现副作用/缺陷?

这个问题与预发布的Java 8 build lambda-8-b50-linux-x64-26_jul_2012.tar.gz有关.

Java 8以默认方法的形式向接口引入了新功能.使用JDK8 lambda编译器进行临时测试允许使用以下形式的接口:

public interface Foo {
  public int foo = 0;
  int foo() default { return foo; }
}
Run Code Online (Sandbox Code Playgroud)

示例实现类型:

public class FooImpl implements Foo {
  public int foo = 1;
}
Run Code Online (Sandbox Code Playgroud)

此代码遵循变量阴影的标准约定:

Foo f = new FooImpl();
System.out.println(f.foo());
System.out.println(f.foo);
System.out.println(new FooImpl().foo);
Run Code Online (Sandbox Code Playgroud)

输出:

0
0
1
Run Code Online (Sandbox Code Playgroud)

文档(JSR 335:用于Java™编程语言版本0.5.1的Lambda表达式)未提及成员变量.我倾向于认为编译器过于宽容,但也许我错过了一些东西.

Tim*_*imK 29

接口中的公共字段不是Java 8中的新功能.如果您记得它们是隐式静态和最终的,那么您看到的结果非常有意义.

  • +1 - 我们可以补充一点,Java 8不能将公共接口字段更改为非静态和/或非最终,而不会以各种方式破坏大量现有代码. (4认同)
  • 要测试,请尝试`Foo.foo = 0;` (2认同)
  • 卫生署!你是对的 - 我在过去的15年里一直宣称他们是静态决赛.以下是JLS的相关部分:[9.3.字段(常量)声明](http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.3). (2认同)