gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:26:18 24 4
gpt4 key购买 nike

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

对象“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 andCollections 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 newsort implementation may throw an IllegalArgumentException if it detectsa Comparable that violates the Comparable contract. The previousimplementation silently ignored such a situation. If the previousbehavior is desired, you can use the new systemproperty java.util.Arrays.useLegacyMergeSort, to restore previousmergesort behavior.

Nature of Incompatibility: behavioral

RFE: 6804124

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com