Java 10编译的类可以在9上运行吗?

Mor*_*hai 4 java java-10

如果我理解正确,Java 10的二进制形式与Java 9完全相同,那么它不会产生任何问题.

我的假设是否正确?

Bri*_*etz 16

这与Java 10无关; 规则与以往一样.

在每个Java版本中,类文件版本号都已递增.您可以在新的Java运行时上运行较旧的类文件(您可以运行二十年前在Java 10上的Java 1.0下编译的文件!),但从未在真正的运行时运行较新的类文件.Java 10没有改变.

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

// Run this on Java 8
javac -source 6 -target 6 Foo.java
Run Code Online (Sandbox Code Playgroud)

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

javac --release 9
Run Code Online (Sandbox Code Playgroud)

这不仅意味着-source 9-target 9,但是编译器也将阻止你使用9之后推出的JDK功能.

  • 当使用`--release 9`时,为什么`javac`版本10禁止使用`var n = 1;`?我的意思是,它只是语法糖,它不是影响字节码或类文件结构的东西. (2认同)
  • @DodgyCodeException因为它不是Java 9的Java语言规范所定义的语言的一部分,所以没有“ Java 9”这样的概念,但具有更高版本的所有功能,就像语法糖。语言规范版本(8、9、10),并且--source选项根据规范选择语言级别。 (2认同)

avi*_*gil 6

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

javac --release 9
Run Code Online (Sandbox Code Playgroud)

一切都应该工作正常.更好的是,如果存在需要解决的问题,Java编译器会抱怨.

请注意,UnsupportedClassVersionError如果代码在技术上是有效的,那么即使代码在技术上是有效的,你也会得到一个,因为编译的字节码中包含了所需的最低Java版本,这默认为当前版本的java编译器.

如今,如果要使用较新的java语言功能,还可以使用支持旧JVM的代码,也可以使用多版本jar.