2011-05-17 78 views
3

我使用的接口Predicate<T>com.google.common.base(谷歌番石榴)謂詞<T>方法equals()方法

但我不知道如何有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)); 

預先感謝您的幫助,

回答

13

您正在創建兩個不同的匿名內部類,但它們都不會覆蓋equals,所以您將獲得默認實現,其中任何兩個不等於的引用都被視爲不相等。

由於PredicateDPredicateM的值是不同的引用,所以equals返回false。

+0

你能告訴我關於這個例子嗎?我需要如何覆蓋等於得到結果返回True? – 2011-05-17 12:14:43

+0

@ user757202:如果沒有*瘋狂*量的分析,您確實無法(使用您當前的匿名內部類)來指示兩種情況下'apply'方法中的代碼是等價的。你真的想達到什麼目的?什麼是更大的圖片? – 2011-05-17 12:32:46

+0

謝謝,我試圖實現基本集合論。集合A被定義爲謂詞:(如果Predicate.apply(x),則x在A中)。我需要相等的屬性來排列類「set」的不同元素。我想我不能爲此使用接口謂詞。 – 2011-05-17 12:47:30

0

爲了得到這個打印true,你將不得不重寫這些類的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); 
} 
0

我不認爲有必要重載equals()。謂詞是功能類。 Object.equals(){return (this == obj);}是合理的。