我目前正在使用gradle,似乎我可以通过java-plugin设置源兼容性和目标兼容性
我想知道除了向后兼容旧版 JDK 之外,我们使用源兼容性/目标兼容性的原因是什么?
如果未设置源兼容性/目标兼容性,升级到最新的 java 会更容易吗?
是否应该使用源兼容性和目标兼容性?
最佳答案
sourceCompatibility
和targetCompatability
变量与 -source
直接相关和-target
打开javac
。它们用于交叉编译( relevant documentation for javac
、 relevant SO question )。这些值的唯一目的是使您的类文件向后兼容。它们实际上没有任何其他目的。这是出于安全目的或多或少添加的功能。您可以安装较新的 JDK 并使用这些值来编译代码,而不是在计算机上安装较旧的、安全性较低的 JDK。
不过,这些标志有一个主要警告:仅仅因为您设置了这些值并不意味着您编写的代码可以在较旧的 JVM 上运行。这是因为虽然 javac
将编译您的类以使它们与较旧的 JVM 兼容,但您仍然可能最终绑定(bind)到较旧的 JVM 中不存在的方法。
例如,如果您将兼容性值设置为 '1.6'
并且您使用 JDK 8 运行构建,您仍然可以编写如下代码:
Objects.equals(obj1, obj2);
编译器不会提示。它仍然会构建而不会提示那条线。但是,如果您尝试使用 Java 6 运行它,您将收到一条错误,指出 Objects.equals
不存在,因为 Objects
在 Java 7 中引入。
换句话来说:-source
和-target
使您的 .class 文件与旧版 JVM 兼容,但它们不会验证代码使用的类和方法。唯一的方法是使用 -bootclasspath
,此时,您不妨下载并使用较旧的 JDK 进行编译,因为您必须这样做才能获得 rt.jar
所需的文件( relevant SO question )。
就升级而言,设置这些值并不一定会限制您的升级能力。如果您计划在该版本中使用您编写的代码,那么您编写的代码必须与您使用的任何值兼容,但没有什么可以阻止您更改它们并开始使用更新的功能和 API。
关于java - 源兼容性 目标兼容性 使用原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47819032/