当前位置: 首页 > 知识库问答 >
问题:

包含lambda表达式的代码会在较旧的JVM上运行吗,比如Java1.6?[副本]

白弘伟
2023-03-14

lambda是在Java8中引入的。包含lambda表达式的代码会在较旧的JVM上运行吗,比如Java1.6?我关心的是二进制兼容性,而不是源代码兼容性。这是一个简单的是/否的问题。

多谢了。

共有1个答案

艾灿
2023-03-14

Oracle非常努力地将Java语言和JVM字节码语言分开。Java语言规范只说明了包含lambda表达式的程序意味着什么,它没有说明该程序应该如何编译或解释。

这特别意味着Java语言规范中没有任何内容禁止lambda表达式以这样一种方式编译,即生成的代码可以由Java6 JVM执行,但Java语言规范中也没有任何内容保证这一点。允许每个Java供应商以他们想要的任何方式对lambda表达式进行编码。(显然,出于实用的原因,大多数人都试图与Oracle所做的事情非常匹配。这样,例如,能够理解并对Oracle的javac编码的lambda进行反向工程的调试器/解编译器/工具将自动与IBM J9 JDK的Java编译器产生的字节码一起工作。)

Oracle JDK附带的javac编译器使用相当复杂的lambdametafactorymethodhandleinvokedynamic机制来编码lambda表达式。后者只在Java7 JVM中引入,因此这意味着Oracles JDK的javac使用的特定编码至少需要一个Java7 JVM。但其他编码肯定是可能的,没有任何一个复杂的机械是真正必要的,它只是一个性能优化。例如,您可以将Lambda表达式编码为内部类,这将适用于Java1.1JVM ;毕竟,这正是我们编写“穷人的Lambda”直到Java8的方法;这也是lambdas的最初提案,甚至是Java8的早期预览版实现它的方式,毕竟,Java中lambdas的开发甚至早于Java7和invokedynamic

有一个名为RetroLambda的编译器,它编译Java 8 JVM字节码(而不是Java源代码!)由Oracle JDKjavac生成到Java 7 JVM字节码、Java 6 JVM字节码或Java 5 JVM字节码。使用这个编译器,您可以从使用(几乎)所有Java8特性的Java8源代码生成一个包含字节码的类文件,该字节码将在任何Java5或更高版本的JVM上运行。

 类似资料:
  • 我试图在包含lambda表达式的类字段的输出上实现一个简单的数据验证。验证是使用自定义注释和ConstraintValidator完成的,如下所示: 我的问题是,上面的代码生成了一个编译错误,指出“不允许此数据类型使用注释@Mandatory” 如果我从自定义注释中删除“@Constraint(validatedBy=MandatoryValidation.class)”行,错误就会消失,这让我认

  • 问题内容: 我正在浏览Java源代码中的接口,并遇到了以下这段代码: 从方法声明中,我知道这是一个通用方法,该方法返回一个Comparator类型,该Comparator类型可以从传递给它的映射条目中推断出来,也可以在该方法中明确提供。 真正让我失望的是返回值。似乎lambda表达式 被显式转换为。这是正确的吗? 我还注意到,表观演员包括。我之前从未见过将接口与类组合在一起的类型,但是在编译器中它

  • 我在查看接口的Java源代码时,遇到了以下代码片段: 从方法声明中,我得到这是一个通用方法,它返回一种类型的比较器,这种比较器要么是从传递给它的映射条目中推断出来的,要么是在方法中显式提供的。 真正让我恼火的是返回值。看来λ表达式 显式转换为 ?有人能澄清这一切吗?

  • P.S.如果您将这两行代码作为结果所做的事情添加进去,那将是非常感谢的。

  • Java8引入了重要的新语言特性,如lambda表达式。 语言中的这些变化是否伴随着编译字节码中的重大变化,从而阻止它在不使用某些反向翻译器的情况下在Java7虚拟机上运行?