首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >源兼容性目标兼容性使用原因

源兼容性目标兼容性使用原因
EN

Stack Overflow用户
提问于 2017-12-15 01:29:02
回答 1查看 252关注 0票数 2

我目前正在使用gradle,似乎可以通过java-plugin设置源兼容性和目标兼容性

我想知道我们使用源兼容性/目标兼容性而不是向后兼容旧版JDK的原因是什么?

如果没有设置sourcecompatibility/targetcompatibility,升级到最新的java会不会更容易?

是否应该使用源兼容性和目标兼容性?

EN

回答 1

Stack Overflow用户

发布于 2017-12-15 02:36:26

sourceCompatibilitytargetCompatability变量与javac上的-source-target开关直接相关。它们用于交叉编译(relevant documentation for javacrelevant SO question)。这些值的唯一目的是使您的类文件向后兼容。它们并没有真正起到任何其他作用。这是一个或多或少出于安全目的而添加的功能。您可以安装一个较新的JDK并使用这些值来编译您的代码,而不是在您的机器上安装一个较旧的、安全性较低的JDK。

但是,这些标志有一个主要的警告:仅仅因为您设置了这些值并不意味着您编写的代码可以在较旧的JVM上工作。这是因为虽然javac将编译您的类以使它们与旧的JVM兼容,但您仍然可能最终绑定到那个旧的JVM中不存在的方法。

例如,如果将兼容性值设置为'1.6',并且使用JDK8运行构建,则仍然可以像这样编写代码:

代码语言:javascript
复制
Objects.equals(obj1, obj2);

编译器也不会抱怨。它仍然会继续构建,而不会抱怨这一行。但是,如果您尝试在Java6中运行它,您会得到一个错误,指出Objects.equals不存在,因为Objects是在Java7中引入的。

换句话说:-source-target 使您的.class文件与旧的JVM兼容,但是它们不验证您的代码使用的类和方法。要做到这一点,唯一的方法是使用-bootclasspath,这时,您也可以直接下载并使用较旧的JDK进行编译,因为您必须这样做才能获得所需的rt.jar文件(relevant SO question)。

就升级而言,设置这些值并不一定会限制您的升级能力。如果您打算在该版本中使用您编写的代码,则它必须与您使用的任何值兼容,但没有什么能阻止您更改它们并开始使用更新的功能和API。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47819032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档