匿名类字段访问Java 1.8与旧版本的兼容性

Blo*_*ura 5 java final anonymous-class java-8

在Java 1.8上,您不必定义一个字段,因为final它可以从匿名类中获取.

例如,在旧版本上:

public void foo(final int bar) {
  new Runnable() {
    public void run() {
      System.out.println(bar);
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

但是,现在,在Java 1.8上,bar不需要是最终的:

public void foo(int bar) {
  new Runnable() {
    public void run() {
      System.out.println(bar);
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我编译我的项目,并且我正在使用的Java 1.8上实现的唯一资源就是这个(我没有使用任何lambdas,新类等),我的代码是否可以在具有较旧Java版本的计算机上执行?如果没有,为什么?

Hol*_*ger 6

使用时编译-target 1.8,javac将发出52.0以前的JVM不支持其版本号的类文件.所以,即使这是唯一的区别,它也会阻止你执行编译的文件-target 1.8.

而且javac不支持指定-source 1.8,并-target 1.7在同一时间.它将产生错误消息source release 1.8 requires target release 1.8.

但实际上,如果使用有效的最终变量是您使用的唯一Java 8功能,除了版本号之外没有字节代码差异.如果编译这样的代码目标1.8并修补类文件,减少51.0它们将在Java 7上运行的版本号.这就像将索引7处的字节减少一样简单.

如果你想创建Java 7兼容代码,那么在使用Java 8编译器时,要特别注意不使用其他Java 8特性......