使用本地类型推断的程序可以在较低的 Java 版本上运行吗?

Would a program using local type inference work on lower Java versions?

Java10介绍了局部类型推断,真的很酷:

var list = new ArrayList<String>(); // Compiles fine

然而,人们似乎不愿意在新版本发布的那一天(周、月、年)更新他们的 Java 版本。

这意味着我需要等到 Java 8 的 EOL 才能使用 List.of(1, 2, 3) 如果想支持大多数使用旧 Java 版本的用户。

另一方面,本地类型推断可能会在编译为字节码时被推断出来,因此使用它的程序可能会 运行 在较旧的 Java 版本(9 或 8)上。另一方面,Java 似乎喜欢在 运行 时进行优化,这可能意味着类型推断需要 JRE 版本 10。

有人试过这个吗? 是否 程序在旧 Java 版本上使用类型推断 运行?

感谢您的意见。

类型推断不会更改字节码,因此原则上,使用 var 编译的代码将与旧版 JVM 兼容。
但是,与往常一样,javac 不允许您将 -source 选项与比 -target 选项更高的发行版本结合使用。

因此,在源代码中使用 var 到 运行 旧版本的唯一方法是为 Java 10 编译它,然后向下移植已编译的 classes 到早期版本。最简单的方法就是更改 class 文件版本。我刚刚验证了一个使用 var 的简单测试用例在减少 class 版本号后在 Java 9 上工作。但是,当然,更复杂的向下移植工具应该验证没有其他代码功能或 API 对较新平台功能的引用。

也许会出现一个替代编译器,允许灵活地使用较新的源版本和较旧的目标版本。正如开头所说,javac从来没有这样做过。