2014-10-01 73 views
0

我在一個類中使用下面的代碼來模擬國稅局與僱主文件根據過濾器。我需要重寫equals類,但我不斷收到錯誤,指出在調用對象時無法找到我嘗試使用的方法。如何在Java中的等同重寫方法中投射對象?

@Override 
public boolean equals(Object obj) { 
    if ((this == null)|| (obj == null) || (this.getClass() != obj.getClass())) 
     return false; 
    if ((this.sameEmployer((Employer)obj)) 
    && (this.getEmployeeSSN() == (Employer)obj.getEmployeeSSN()) 
    && (this.getName() == (Employer)obj.getName()) 
    && (this.getEmployeeName() == (Employer)obj.getEmployeeName()) 
    && (this.getEmployeeWages() == (Employer)obj.getEmployeeWages())) 
     return true; 
    else 
     return false; 
} 
+2

一筆記「這個== NULL」永遠不會發生這樣可以去掉這個 – Loc 2014-10-01 20:53:31

+0

'this.getName()== (Employer)obj.getName()'我猜'getName()'返回一個'String',對嗎?然後使用'this.getName()。equals(((Employer)obj).getName())'代替。 – Tom 2014-10-01 20:57:36

回答

1

Object沒有getEmployeeSSN()。你應該擁有的卻是:

(this.getEmployeeSSN() == ((Employer)obj).getEmployeeSSN() //and so forth. 

演員應該發生,然後再嘗試使用該方法的鑄造對象方法調用後

+0

那麼該對象必須是僱主類,因爲如果是這樣的話,它將有權訪問我原以爲會想到的方法。所以這就是我需要解決的問題。 – Ethan 2014-10-01 20:54:44

+0

@Ehan,對象是一個僱主類,但是你需要用'(Employer)obj'完成轉換,然後才能使用Employer類的方法。 – kolossus 2014-10-01 20:55:47

3

鑄造發生在。 According to the precedence of operators,()用於方法調用的最高級別爲1,而鑄幣的()等級爲3.換句話說,您試圖將obj.getEmployeeSSN()鑄造爲Employer而不是obj

一旦知道objEmployer,您可以放置​​圓括號以強制先施放,例如,

&& (this.getEmployeeSSN() == ((Employer) obj).getEmployeeSSN()) 

但是,它看起來像一團圓括號。爲了清楚起見,只需聲明一個Employer變量,將其轉換一次,然後調用方法,傳遞Employer變量。

Employer emp = (Employer) obj; 
if (this.sameEmployer(emp) 
    && ... 
+0

這工作。非常感謝。 – Ethan 2014-10-01 20:56:41

2

對於這樣的表述:

(Employer)obj.getEmployeeSSN() 

.具有更高的優先級 - 「結合更緊」 - 比投。所以它更接近:

(Employer) (obj.getEmployeeSSN()) 

...而你想:

((Employer) obj).getEmployeeSSN() 

,以演員和然後調用方法。

public boolean equals(Object obj) { 
    if (obj == null || this.getClass() != obj.getClass()) { 
     return false; 
    } 
    Employee other = (Employee) obj; 
    // Now use "other" in the rest of the code: 
    return sameEmployer(other) 
     && getEmployeeSSN() == other.getEmployeeSSN() 
     ...; 
} 

需要注意的是:這是最容易被在前面的線鑄造完成

  • this不能爲空,所以你不需要測試它
  • 你不需要幾乎與之前一樣多的括號
  • 我強烈建議您對所有的if塊使用大括號......如果沒有其他錯誤,您會感到驚訝。 (有很多SO問題基本上是由於...)
  • 任何時候你有:

    if (foo) { 
        return true; 
    } else { 
        return false; 
    } 
    

    你應該把它簡化爲:

    return foo; 
    
0

你只是有一個問題,您的業務優先級。調用(僱主)會在您調用特定方法後發生。要強制你需要添加括號中的優先級:

((Employer) obj).getName() 

代替

(Employer) obj.getName()