2012-08-30 149 views
5

可能重複:
Returning false from Equals methods without Overriding等於返回false

我的一個同事今天問我一個問題提到以下

寫TestEquals類(自定義或用戶定義的類),以便代碼中的以下sop打印false

public class Puzzle3 { 
    public static void main(String[] args) { 
    TestEquals testEquals = new TestEquals(); 
    System.out.println(testEquals.equals(testEquals)); 
    } 
} 

注意:您不能覆蓋equals方法。

我想了很多,但沒有重寫equals就找不到解決方案。有誰知道它是如何做到的?

+7

這不是功課? –

+4

**允許**重載嗎? – home

+2

重複得到兩個downvotes和接受的答案只有四個upvotes。是什麼讓這個問題變得更好? – maba

回答

17

使用

public boolean equals(TestEquals equals) { 
    return false 
} 

要覆蓋等於你需要輸入參數的類型爲對象,這樣上面的代碼片斷theorectially不是壓倒一切等於從對象的方法

+5

如果你覺得它也可以返回一個'String'。 –

+0

令人驚歎!迄今已有13個投票。 – maba

+0

@DuncanJones好點我沒有想到那個+1指出了 – RNJ

0

我不知道爲什麼會任何人都想要這樣做。但是你可以創建一個方法,如下圖所示:

public boolean equals(SuperEquals equals) { return false; } 

SuperEqualsTestEquals任何超類而不是Object

1

正如上面提到的,你可以寫像這樣的方法:

public boolean equals(TestEquals e) { 
    return false; 
} 

此外,如果TestEquals可以擴展一些其他的對象:

public TestEquals extends Something { 
} 

public Something { 
    @Override public boolean equals(Object o) { 
     return false; 
    } 
} 
11

編輯:顯然someone else這個想法首先到達在另一個線程上,但我會留下這裏,因爲這段代碼非常簡單。


class TestEquals { 

    static { 
    System.setOut(new PrintStream(new FilterOutputStream(System.out) { 
     public void write(byte[] buf, int pos, int len) throws IOException { 
     if (len >= 4 && buf[pos] == 't') { 
      out.write(new byte[] { 
       (byte) 'f', (byte) 'a', (byte) 'l', (byte) 's', (byte) 'e' 
      }); 
      out.write(buf, pos + 4, len - 4); 
     } else { 
      out.write(buf, pos, len); 
     } 
     } 
    })); 
    } 
} 

這可怕的黑客不會覆蓋或過載任何與equals做的,但創造的TestEquals實例的行爲造成的類加載它包裝System.out,將與't'開始任何後續打印將導致打印"false"而不是前4個字節。 (假設默認的編碼不是超級異域的東西)

+0

優秀想法:) – gontard

+0

+ 1爲思維開箱即用。 – maba

-1

在我的iPad上......策略應該像是有一個修改過的aun屬性,每次你修改它時都會被修改......如果屬性通過equals上的getter訪問。你提到equals不能被覆蓋,所以這個屬性應該是私有的,並且值的修改發生在讀取值之前和之後,以確保它的工作,無論它是等於的第一部分還是第二部分。

喜歡的東西(對不起任何語法錯誤):

public class TestEquals{ 

private int id; 

public int getId(){ 
    int temp; 
    id++; 
    temp=id; 
    id++; 
    return temp; 
} 
} 
+0

Object.equals(Object obj)中的第一個檢查是'if(this == obj)return true'。 –