为了减少匿名类型的大量实例化造成的困惑,我正在探索利用 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/