在不使用 apache CompareToBuilder 的情况下实现我自己的 compareTo()

implementing my own compareTo() without using apache CompareToBuilder

我有以下 class 使用 apache commons compareTo()。我想在 compareTo() 中用我自己的实现替换它。当我按照下面的概述进行替换时,我开始得到重复的密钥。

我开始收到 java.lang.IllegalArgumentException:具有相同密钥的多个条目:....

我没有修改任何 class 中的 equals 或 hashcode 方法。

我的 compareTo() 实现有误吗?

class key {

    private final PrimaryKeyInfo keyInfo;
    private final String value;

  // ommitting constructor details
    .............

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Key key = (Key) o;

        if (keyInfo != null ? !keyInfo.equals(key.keyInfo) : key.keyInfo != null) return false;
        return value != null ? value.equals(key.value) : key.value == null;

    }

    @Override
    public int hashCode() {
        int result = keyInfo != null ? keyInfo.hashCode() : 0;
        result = 31 * result + (value != null ? value.hashCode() : 0);
        return result;
    }

 @Override
    public int compareTo(Key o) {
        return new CompareToBuilder()
                .append(keyInfo, o.keyInfo)
                .append(value, o.value)
                .toComparison();
    }
}

}

//我把上面的compareTo()方法换成了下面的

@Override
public int compareTo(Key o) {
    if (this == o){
        return 0;
    }
    if(keyInfo.equals(o.keyInfo)){
        return value.compareTo(o.value);
    } else{
        return keyInfo.compareTo(keyInfo);
    }
}

Post这个,

错误

我开始收到 java.lang.IllegalArgumentException:具有相同密钥的多个条目:....

另外添加 PrimaryKeyInfo class 以供参考

public class PrimaryKeyInfo implements Comparable<PrimaryKeyInfo> {
    private final DataType dataType; //Just a enum of data types
    private final String name;

      // ommitting constructor details
        .............

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        PrimaryKeyInfo that = (PrimaryKeyInfo) o;

        if (dataType != that.dataType) return false;
        return name.equals(that.name);

    }

    @Override
    public int hashCode() {
        int result = dataType.hashCode();
        result = 31 * result + name.hashCode();
        return result;
    }

 @Override
    public int compareTo(PrimaryKeyInfo o) {
        return new CompareToBuilder()
                .append(dataType, o.dataType)
                .append(name, o.name)
                .toComparison();
    }
}

这是一个简单的错字:

return keyInfo.compareTo(keyInfo);

应该是:

return keyInfo.compareTo(o.keyInfo);