我正在使用Predicate<T>
(Google Guava)
com.google.common.base
但我不知道如何让equals()
方法有效......
当我输入类似内容时,为什么会得到false
:
Predicate<Object> PredicateD = new Predicate<Object>(){
@Override public boolean apply(Object number) {
return ((number instanceof Double) && (Math.floor((Double)number) == (Double)number));
}
};
Predicate<Object> PredicateM = new Predicate<Object>(){
@Override public boolean apply(Object number) {
return ((number instanceof Double) && (Math.floor((Double)number) == (Double)number));
}
};
System.out.println(PredicateD.equals(PredicateM));
提前感谢您的帮助,
答案 0 :(得分:13)
您正在创建两个不同的匿名内部类,但它们都没有覆盖equals
,因此您将获得默认实现,从而考虑任何两个不相等的引用不相等的。
由于PredicateD
和PredicateM
的值不同,equals
返回false。
答案 1 :(得分:0)
为了使其打印true
,您必须覆盖这些类上的equals方法。您的自定义equals必须检查参数是否是这些类中的任何一个的实例。由于它们是匿名的,你无法引用它们,因此你无法真正做到这一点。
我的建议是创建一个非匿名类(比如IntegerCheckingPredicate
),然后创建该类的predicateD
和predicateM
个实例。那么你的equals方法可能如下所示:
public boolean equals(Object o) {
if (o instanceof IntegerCheckPredicate) {
return true;
}
return false;
}
然后这个测试将通过:
@Test
public void testPredicatesWithEqualsOverriddenAreEqual() {
IntegerCheckPredicate predicateM = new IntegerCheckPredicate();
IntegerCheckPredicate predicateD = new IntegerCheckPredicate();
assertEquals(predicateM, predicateD);
}
答案 2 :(得分:0)
我认为不必覆盖equals()。谓词是功能类。 Object.equals(){return (this == obj);}
是合理的。