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

标签 java lambda backwards-compatibility java-8

为了减少匿名类型的大量实例化造成的困惑,我正在探索利用 Java 8 lambda 的可能性。

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

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

例如,给定单一方法接口(interface):

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 级别的源代码级别。因此答案是否定的。

关于java - 编译后的 Java 8 lambda 表达式是否向后兼容早期版本的 Java 运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22572230/

相关文章:

java - Java 微服务之间的签名 JWT

java - 如何使用 docx4j 识别 TextBox 中的文本并替换占位符

sdk - Symbian 的不同版本

windows - Win95编程为Win8

c# - 包含具有向后兼容性的泛型的类的序列化

java - 莫尔斯电码翻译器 - 似乎无法准确地从莫尔斯电码转换为英语

java - 从表 darby apache db 中的日期列中获取缺失的日期

c++ - 按值将 shared_ptr 传递给 lambda 会泄漏内存

c++ - +[](){} 有什么不同;和 (+[](){});以及为什么表达式有效

java - 在参数中给定多个条件时过滤流