编译的 Java 8 lambda 表达式是否向后兼容早期版本的 Java 运行时?
2022-09-04 20:08:26
为了减少匿名类型的大量实例化造成的混乱,我正在探索利用Java 8 lambdas的可能性。
在生产环境中使用 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 运行时上而无需修改?