【发布时间】:2013-08-07 23:30:09
【问题描述】:
作为实习的一部分,我被要求调查一个错误。 一段代码在抛出
java.lang.IllegalArgumentException:比较方法违反了它的一般约定!
自定义Comparator 正在通过查看所述自定义类的long 成员变量来比较两个自定义类:
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
此自定义类的equals 方法查看此自定义类的String 成员变量。
我们在重现这种行为时遇到了麻烦。
我的下意识反应是用return v2.compareTo(v1); 替换自定义Comparator 中的return 语句,
但我的团队怀疑这是否能解决问题。
谁能提供任何见解?
Arrays.sort(anArray, new Comparator<ACustomClass>() {
@Override
public int compare(ACustomClass o1, ACustomClass o2) {
long v1 = o1.getALong();
long v2 = o2.getALong();
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
}});
【问题讨论】:
-
有机会发布一些实际代码吗?
-
你说你无法重现这个问题,但你也说你知道哪段代码抛出了异常。是哪个?
-
Comparator documentation 有一些关于“等于”一致性的注释。我想说的是,如果 Comparator 在 equals() 返回 false 时可能返回 0,或者如果 Comparator 在 equals() 返回 true 时返回非零,那么您可能会遇到麻烦。
-
你为什么不在这里使用
Long.compare()? -
跟进我之前的评论:我快速查看了运行时源,消息来自 TimSort 或 ComparableTimSort。这些类似乎没有直接调用 equals(),但它们可能会调用其他使用 equals() 的东西。但我需要做很多工作才能进一步深入研究。
标签: java java-7 comparator illegalargumentexception