java-7 - 比较方法违反了它的一般契约!仅限 Java 7

标签 java-7 compareto

我知道这个问题已经有一段时间了,并检查了我之前可以获得的所有答案,但这个仍然不起作用。

对象“crew”代表具有等级和其他项目的船员。应通过比较 int 值“assigned_rank”来进行比较,如果两个实例中该值相等,则 bool 值“is_trainer”应该会产生差异。

只要使用 java < 7 运行,此方法就非常有效。但自从 Java 7 以来,我一直得到这个:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)

这是来源,其中一些潜在危险的部分已经被注释掉,但它仍然不起作用:

public class crew implements Serializable, Comparable<crew> {

private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...


@Override
public int compareTo(crew him) {

    int myRank = this.getAssigned_rank();
    int hisRank = him.assigned_rank;

    if (this == him) {
        return 0;
    }
    if (myRank > hisRank) {
        return 1;
    }
    if (myRank < hisRank) {
        return -1;
    }
    if (myRank == hisRank) {
//            if (is_trainer && !o.is_trainer) {
//                i = 1;
//            }
//            if (!is_trainer && o.is_trainer) {
//                i = -1;
//            }
//            if (is_trainer && o.is_trainer) {
//                i = 0;
//            }
//            if (!is_trainer && !o.is_trainer) {
//                i = 0;
//            }
        return 0;
    }

    return 0;
}

@Override
public int hashCode() {
    int hash = 7;
    hash = 31 * hash + this.assigned_rank;
    hash = 31 * hash + (this.is_trainer ? 1 : 0);
    return hash;
}

@Override
public boolean equals(Object o) {

    if (this == o) {
        return true;
    }


    int myRank = this.getAssigned_rank();
    int hisRank = 0;

    if (o instanceof crew) {
        crew him = (crew) o;
        hisRank = him.assigned_rank;
    } else {
        return false;
    }

    if (myRank > hisRank) {
        return false;
    }
    if (myRank < hisRank) {
        return false;
    }
    if (myRank == hisRank) {
//            if (is_trainer && !o.is_trainer) {
//                i = 1;
//            }
//            if (!is_trainer && o.is_trainer) {
//                i = -1;
//            }
//            if (is_trainer && o.is_trainer) {
//                i = 0;
//            }
//            if (!is_trainer && !o.is_trainer) {
//                i = 0;
//            }
        return true;
    }

    return false;
}

}

实现 equals() 只是解决这个问题的尝试。给定的异常带有或不带有 equals()。我看不出compareTo 方法如何违反其契约。非常感谢任何帮助...有一天这段代码必须与 java 7 一起工作,但我不知道如何... 谢谢

最佳答案

看这个:

来自http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source

Area: API: Utilities Synopsis: Updated sort behavior for Arrays and Collections may throw an IllegalArgumentException

Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) by java.util.Collections.sort has been replaced. The new sort implementation may throw an IllegalArgumentException if it detects a Comparable that violates the Comparable contract. The previous implementation silently ignored such a situation. If the previous behavior is desired, you can use the new system property java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.

Nature of Incompatibility: behavioral

RFE: 6804124

有关更多详细信息,请参阅错误数据库 reference here .

关于java-7 - 比较方法违反了它的一般契约!仅限 Java 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7849539/

相关文章:

java - 未找到 java.nio 的最新添加内容;使用java 1.7.0_9

java-7 - 使用 Guava 14+ 和 Java 7 计算 md5

java - 如何根据不同的变量对对象进行排序?

java - 不抛出异常类型处理时出现问题 - 想要一个更通用的多捕获版本

java - 使用 <> 通过匿名类创建 map

ejb - 不支持的类版本错误

java - 使用 compareTo 实现 equals 方法

java - 使用 .compareTo 比较日期时,为什么不考虑月份?

Java 没有自动装箱 int 的 compareTo 方法?

java - 重写自定义Java类中的compareTo()方法?