如果我执行以下操作
myObject.myMethod(myClass.getComparator());
与
public void myMethod(Comparator<? super myOtherObject> comparator) {
if (comparator.equals(myClass.getComparator()) {
//do sth
}
}
在我的类(class)
static Comparator<ListItem> getComparator() {
return new Comparator<myOtherObject>() {
public int compare(myOtherObjectitem1, myOtherObjectitem2) {
return (Integer.valueOf(myOtherObject.getRating()).compareTo(Integer.valueOf(myOtherObject.getRating())));
}
};
}
那么“//do sth”不会被执行。所以我两次getComparator得到的对象是不一样的。怎么可能?有机会看到哪个比较器“myMethod”得到了吗?
最佳答案
你在这一行调用了 equals
方法:
if (comparator.equals(myClass.getComparator())
由于您没有在 Comparator 类(这是一个匿名内部类)上显式定义此方法,因此默认为从 Object
继承的版本 - 只有当两个引用是完全相同的对象。
而您的 getComparator()
方法状态为 return new Comparator() { ... }
,因此它调用构造函数并在每次调用时创建一个新对象。因此,一次调用 getComparator
的结果将是一个不同的对象,因此不会被视为等于另一次调用的结果。
我可以想到两种可能的方法来更改您的代码,以便相等性测试返回 true:
只创建一次比较器,并从
获取比较器
。这将涉及一个有点像myClass
中的以下内容:private static Comparator<ListItem> cmp = new Comparator<myOtherObject>() { public int compare(myOtherObjectitem1, myOtherObjectitem2) { return (Integer.valueOf(myOtherObject.getRating()).compareTo(Integer.valueOf(myOtherObject.getRating()))); } }; static Comparator<ListItem> getComparator() { return cmp; }
提供一个显式的
equals()
实现(理想情况下还有一个hashCode()
实现)。然后,您可以准确控制哪些对象被认为等于您的比较器之一。如果您为比较器定义一个具体类而不是匿名内部类,这可能会容易得多。
不过,归根结底,我担心您的方法可能不正确。两个比较器彼此相等意味着什么?我觉得这对于数据类以外的任何事物来说都是一个模棱两可的概念,我会犹豫是否为此使用 Object.equals
方法。
(例如,如果您所说的相等是指“它们将按相同顺序对列表进行排序”,那么我会向您的比较器类添加一个名为 isEquivalentSortOrder
或类似名称的方法。这样您可以准确地说明你的意思,而不必依赖“相同”的模糊定义。)
关于java - 比较Java中的两个比较器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13683363/