编译后的Java 8 lambda表达式向后兼容Java运行时的早期版本吗?


问题内容

为了减少由众多匿名类型的实例化引起的混乱,我正在探索利用Java 8 lambda的可能性。

在生产环境中使用Java
8和lambda之前,一个重要的考虑因素是使用lambda表达式的JDK8编译代码是否可以在Java运行时的早期版本上执行。我对JRE6和JRE7作为目标平台特别感兴趣。

一方面,我了解到lambda只是围绕包含一个方法的匿名类的实例化的语法糖。另一方面,我不确定这种等效性是否意味着为每个生成的字节码在除JRE8之外的所有JVM版本中都是相同和/或兼容的。

例如,给定单方法接口:

public interface Action<T> {
    public void perform(T argument);
}

以下两个片段在功能上是等效的:

使用lambda:

final Action<String> y = i -> System.out.println(i);

使用匿名类实例:

final Action<String> y = new Action<String>() {
    @Override
    public void perform(final String i) {
        System.out.println(i);
    }
};

我的具体问题是两个结构的 语义对 等是否扩展到其 编译表示的对等
。此外,如果它们确实等效编译,这种等效性是否表示可以将lambda表达式的编译形式托管在Java运行时的早期版本中而无需进行修改?


问题答案:

通常,Javac编译器不可能使用高于目标JVM级别的源级别。因此答案是否定的。