当前位置: 首页 > 面试题库 >

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

姚向晨
2023-03-14
问题内容

为了减少由众多匿名类型的实例化引起的混乱,我正在探索利用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级别的源级别。因此答案是否定的。



 类似资料:
  • ngrok承诺有关其接口的兼容性和稳定性,以便您可以自信地构建集成顶部,知道在升级到较新版本时期望的更改。 兼容性承诺 Point Release (2.0.0 -> 2.0.1) - ngrok承诺在点发布之间没有突破性的变化 Minor Version Change (2.0 -> 2.1) - ngrok可能会进行小的更改,打破兼容性的次要版本更改。 ngrok承诺,任何破坏性更改将由一个版

  • 当我使用搜索功能时,我得到一个http Status500错误。它声称 错误报告 搜索servlet代码 结果jsp

  • 问题内容: 我的理解是,为了维护源代码兼容性,Java从未将新方法引入公共接口,因为这破坏了实现接口的现有客户端。 Java发行说明说明 通常,该政策如下,但以下列出的不兼容之处除外: 维护版本(例如1.4.1、1.4.2)未引入任何新的语言功能或API。他们将保持彼此之间的源兼容性。 功能版本和主要版本(例如1.3.0、1.4.0、5.0)保持向上但不向下的源兼容性。 然而,包和继续发展,并介绍

  • 问题内容: Java版本之间是否存在不兼容的问题,其中针对Java版本X的Java源代码/ Java类文件不会在版本Y(其中Y> X)下编译/运行? “ Java版本”是指诸如以下的版本: JDK 1.0(1996年1月) JDK 1.1(1997年2月) J2SE 1.2(1998年12月) J2SE 1.3(2000年5月) J2SE 1.4(2002年2月) J2SE 5.0(2004年9月

  • 如果我有一个用SwiftUI制作的应用程序,它是否适用于iOS13以下的iOS?

  • 我用Intellij来解决这个问题。但我有最新版本的所有新安装在我的系统。 ...已由最新版本的Java运行时(类文件版本57.0)编译,此版本的Java运行时仅识别52.0以下的类文件版本 我已经设定: 完整的错误消息: