compareTo error比较方法违反了其一般合同

时间:2012-10-23 14:11:34

标签: java comparable

我收到以下错误:

  

比较方法违反了其总合同!

这是我的compareTo方法

public int compareTo(ComparableItem another) {
     if (this.score == another.score)
        return this.getItemName().compareTo(another.getItemName());
     else if ((this.score) > another.score)
        return 1;
     else
        return -1;
}

我想比较一下这些项目的得分。但是当得分相同时,我想按名称对它们进行排序。

我需要更改什么以及为什么会出现此错误?

编辑:

得分为int,商品名为String

这是ComparableItem类:

public abstract class ComparableItem extends MenuListItem implements Comparable<ComparableItem> {

protected int score;

public ComparableItem(String itemID, String itemName) {
    super(itemID, itemName);
}

public int compareTo(ComparableItem another) {
     if (this.score == another.score)
        return this.getItemName().compareTo(another.getItemName());
     else if ((this.score) > another.score)
        return 1;
     else
        return -1;
}

public abstract boolean found(String criteria);

这是MenuListItem类:

public class MenuListItem {

private String itemID,itemName;

public MenuListItem(String itemID, String itemName){
    setItemID(itemID);
    setItemName(itemName);
}

public String getItemID() {
    return itemID;
}

public void setItemID(String itemID) {
    this.itemID = itemID;
}

public String getItemName() {
    return itemName;
}

public void setItemName(String itemName) {
    this.itemName = itemName;
}

@Override
public String toString() {
    return this.itemName;
}

1 个答案:

答案 0 :(得分:4)

来自Comparable<T>的Java API:

  

C类的自然排序据说是一致的   等于当且仅当(e1.compareTo((Object)e2)== 0)具有相同的值时   对于C类的每个e1和e2,布尔值为e1.equals((Object)e2)。

为了使用compareTo,api进一步说:

  

强烈建议(尽管不要求)自然   排序与平等一致。这是因为排序集   没有显式比较器的(和排序的地图)表现得“奇怪”   它们与自然顺序的元素(或键)一起使用   与equals不一致。特别是,这样的排序集(或排序的   map)违反了定义的集合(或映射)的一般合同   就平等方法而言。

所以你应该重写equals以与compareTo()保持一致,因为否则两个不同的对象e1和e2具有相同的scoregetItemName()将具有e1.compareTo((Object)e2) == 0)但不会e1.equals((Object)e2)