我知道这个问题已经有一段时间了,并检查了我之前能得到的所有答案,但这个仍然不起作用。
对象“crew”代表具有等级和其他项目的船员。应通过比较 int 值“signed_rank”来进行比较,如果两个实例中该值相等,则布尔值“is_trainer”应该产生差异。
只要使用 java
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 一起工作,但我不知道如何...
谢谢
看到这个:
From http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
区域:API:实用程序概要:更新了数组和
集合可能会抛出 IllegalArgumentException
说明:java.util.Arrays.sort使用的排序算法和
(间接)被 java.util.Collections.sort 取代。新的
如果排序实现检测到,可能会抛出 IllegalArgumentException
违反可比合同的可比公司。以前的
实施默默地忽略了这种情况。如果之前的
行为是所需的,您可以使用新系统
属性 java.util.Arrays.useLegacyMergeSort,恢复以前的
合并排序行为。
不兼容的性质:行为
RFE:6804124
有关更详细的信息,请参阅错误数据库参考这里.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)