在Java 6中编译,在7中运行 - 如何指定useLegacyMergeSort?

2022-09-03 01:57:56

我想知道如果我用Java 6编译,但是有人在Java 7上运行该程序,会使用Java 6或7版本的Arrays.sort吗?

这很重要,因为新的 mergesort 会抛出一个 IllegalArgumentException,而旧的则不会(请参阅比较方法违反了其总协定!仅 Java 7)

现在,可以使用Arrays.useLegacyMergeSort在Java 7中编译,但显然该标志不适用于Java 6 - 我们希望在Mac OS Snow Leopard(使用6)上兼容。

由于某种原因(参见 http://madbean.com/2006/target14/),-target编译器标志似乎没有产生兼容的代码,所以我们宁愿用Java 6编译。

有什么建议吗?


答案 1

尝试设置系统属性

java -Djava.util.Arrays.useLegacyMergeSort=true ...

请注意,它不是来自 Arrays 公共 API,而是来自 src

   /**
     * Old merge sort implementation can be selected (for
     * compatibility with broken comparators) using a system property.
     * Cannot be a static boolean in the enclosing class due to
     * circular dependencies. To be removed in a future release.
     */
    static final class LegacyMergeSort {
        private static final boolean userRequested =
            java.security.AccessController.doPrivileged(
                new sun.security.action.GetBooleanAction(
                    "java.util.Arrays.useLegacyMergeSort")).booleanValue();
    }

答案 2

推荐