我使用的是来自com.google.common.base (Google Guava)的接口Predicate<T>
但是我不知道如何让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));提前感谢你的帮助,
发布于 2011-05-17 18:52:42
您正在创建两个不同的匿名内部类,但它们都没有覆盖equals,因此您将获得默认实现,其中任何两个不相等的引用都被视为不相等。
由于PredicateD和PredicateM的值是不同的引用,因此equals返回false。
发布于 2011-05-17 20:17:42
为了让它打印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);
}发布于 2011-05-17 20:46:57
我认为没有必要重写equals()。谓词是函数类。Object.equals(){return (this == obj);}是合理的。
https://stackoverflow.com/questions/6029755
复制相似问题