谓词<t>方法等于()</t>

时间:2011-05-17 10:50:58

标签: java guava

我正在使用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));

提前感谢您的帮助,

3 个答案:

答案 0 :(得分:13)

您正在创建两个不同的匿名内部类,但它们都没有覆盖equals,因此您将获得默认实现,从而考虑任何两个不相等的引用不相等的。

由于PredicateDPredicateM的值不同,equals返回false。

答案 1 :(得分:0)

为了使其打印true,您必须覆盖这些类上的equals方法。您的自定义equals必须检查参数是否是这些类中的任何一个的实例。由于它们是匿名的,你无法引用它们,因此你无法真正做到这一点。

我的建议是创建一个非匿名类(比如IntegerCheckingPredicate),然后创建该类的predicateDpredicateM个实例。那么你的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);}是合理的。