首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Predicate<T>方法等于()

Predicate<T>方法等于()
EN

Stack Overflow用户
提问于 2011-05-17 18:50:58
回答 3查看 3.9K关注 0票数 4

我使用的是来自com.google.common.base (Google Guava)的接口Predicate<T>

但是我不知道如何让equals()方法工作……

当我键入下面这样的内容时,为什么会得到false

代码语言:javascript
复制
    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));

提前感谢你的帮助,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-17 18:52:42

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

由于PredicateDPredicateM的值是不同的引用,因此equals返回false。

票数 13
EN

Stack Overflow用户

发布于 2011-05-17 20:17:42

为了让它打印true,您必须覆盖这些类上的equals方法。您的自定义equals必须检查该参数是否是这两个类的实例。因为它们是匿名的,所以你无法引用它们,所以你真的不能这样做。

我的建议是创建一个非匿名类(比如IntegerCheckingPredicate),并创建该类的predicateDpredicateM实例。那么equals方法可能如下所示:

代码语言:javascript
复制
public boolean equals(Object o) {
    if (o instanceof IntegerCheckPredicate) {
        return true;
    }

    return false;
}

然后这个测试就会通过:

代码语言:javascript
复制
@Test
public void testPredicatesWithEqualsOverriddenAreEqual() {
    IntegerCheckPredicate predicateM = new IntegerCheckPredicate();
    IntegerCheckPredicate predicateD = new IntegerCheckPredicate();
    assertEquals(predicateM, predicateD);
}
票数 1
EN

Stack Overflow用户

发布于 2011-05-17 20:46:57

我认为没有必要重写equals()。谓词是函数类。Object.equals(){return (this == obj);}是合理的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6029755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档