Java10能不能在类运行上编译成9?

Can Java 10 compiled classes run on 9?

如果我理解正确,Java 10 的二进制形式与 Java 9 100% 相同,所以应该不会有任何问题。

我的假设正确吗?

javac 支持一个 --release 论点已有一段时间了。只要您不使用较新版本的功能(在本例中为 Java 10),您就可以:

javac --release 9

一切都应该正常。更好的是,如果有需要解决的问题,Java 编译器会发出警告。

请注意,如果不执行此操作,您将获得 UnsupportedClassVersionError even if the code is technically valid because the minimum Java version required is included in the compiled bytecode,并且默认为 java 编译器的当前版本。

现在,如果您想要使用更新的 java 语言功能,但还包括支持旧 JVM 的代码,您也可以使用 multirelease jars

这与Java10无关;规则一如既往。

在Java的每个版本中,类文件的版本号都增加了。您可以 运行 较旧的 类文件更新 Java 运行 时间(您可以 运行 二十年前在 [=31] 下编译的文件=] 1.0 on Java 10!),但是你可以 运行 newer classfiles on older 运行time 从来都不是真的。 Java 10.

这没有改变

但是,如果您不使用自该版本以来引入的新功能,则可以编译 类 使其在旧版本上 运行。这过去是由 -source-target 开关完成的:

// Run this on Java 8
javac -source 6 -target 6 Foo.java

您将获得 运行 在 Java 6 及更高版本上的类文件。 (源版本不能大于目标版本。)这最近被更全面的 --release 选项取代:

javac --release 9

这不仅意味着 -source 9-target 9,而且编译器还会阻止您使用 9 之后引入的 JDK 功能。