【发布时间】:2013-04-09 04:43:55
【问题描述】:
我想知道如果我在 Java 6 中编译,但有人在 Java 7 上运行程序,会使用 Java 6 或 7 版本的 Arrays.sort 吗?
这很重要,因为新的合并排序会引发 IllegalArgumentException,而旧的不会(请参阅 Comparison method violates its general contract! Java 7 only)
现在,可以使用 Arrays.useLegacyMergeSort 在 Java 7 中进行编译,但显然该标志不适用于 Java 6 - 我们希望在 Mac OS Snow Leopard(使用 6)上兼容。
出于某种原因(请参阅http://madbean.com/2006/target14/),-target 编译器标志似乎无法生成兼容的代码,因此我们宁愿在 Java 6 中编译。
有什么建议吗?
【问题讨论】:
-
java.util.Arrays.useLegacyMergeSort属性是在运行时指定的,而不是编译时指定的。将它与 Java 6 VM 一起使用时遇到了什么问题? -
即使您针对版本 6 进行编译,您仍将在版本 7 JVM 上使用版本 7。只需设置 System 属性,您将始终使用版本 6 排序。
-
@Alex:如果新的合并排序抛出 IAE,那是因为你的代码是错误的,无论它是在 Java 6 还是 Java 7 中运行。你应该做的是解决这个问题,此时你的代码将在两种环境中运行相同。
-
@LouisWasserman:嗯,是的,不是的!如果代码按照它的意图去做,并且可读和可维护,那么它是否满足这个明显的契约真的是个问题吗?
-
@Alex 这就是合同的重点:只有在你这样做的情况下,你才能确保对方也履行了承诺。以前,它实现了它(或者似乎这样做了——我想以前结果可能不一致)即使你没有,但现在为了更好的实现而改变了。