2013-02-07 32 views
0

我有一個內部有對象的數組。我將如何使用數組元素的方法?我的數組是Object。我試過array[i].getSalary(),但這不起作用。從一個數組中的類中調用方法

+5

你可以投,但我求你不要。不要讓你的數組類型的對象,使其通用。 –

+0

+1。解決方案是讓你的數組不是'Object []'類型,而是'Employee []'類型'或其他類型。 –

+0

我明白,但我們的教授要求它是Object類型。 – Infodayne

回答

4

首先,你應該幾乎從不使用數組Object。原因是,你失去了所有類型的信息:

  • 會使代碼更易於理解的人誰都會閱讀你的代碼(包括你的教授,自己,自己在半年的時候你會忘記了一切代碼)
  • 可以被編譯器和IDE用來告訴你什麼時候你在測試程序之前犯了錯誤。
  • 將避免在本答案的第二部分中我將向您解釋的容易出錯的轉換類型。

而不是使用Object的數組,請使用與將放入其中的對象(或公共基類)相對應的類型的數組。假設你的類叫做Employee,您應該聲明的數組是這樣的:

Employee[] employeeArray; 

employeeArrayarray一個更好的名字,因爲它告訴什麼樣的對象包含,再次可讀性一般,喜歡明確的。變量的名稱。)

如果類Employee包含此類方法,使用該解決方案很容易使用employeeArray[i].getSalary()。這段代碼的意圖在閱讀時也很明顯。

其他可能性是通用集合,如List<Employee>Set<Employee>,這取決於您的需要。

如果你真的必須使用對象數組,並調用getSalary()方法,你將不得不數組元素的方法getSalary()所屬的類或接口。

例如,再次,如果這個類被稱爲Employee

Employee employee = (Employee) array[i]; 
employee.getSalary(); 

什麼鑄造不會是獲得您的對象類型員工的參考。該對象仍然是相同的,但現在可以在此對象上調用Employee的方法。

但是這個解決方案有一些注意事項。首先,它比較冗長,需要兩條線才能做出只有一條。其次,更重要的是,由於您有一組Object,因此您無法確定是否確實有一個Employee類型的對象,如果不是這種情況,則該操作將引發ClassCastException。解決的辦法是首先檢查的對象是真正想要的類型:

Object object = array[i]; 
if (object instanceof Employee) { 
    Employee employee = (Employee) object; 
    employee.getSalary(); 
} 
else { 
    System.err.println("Object is not an Employee: we can not call getSalary()!"); 
} 

但是你看,它變得更加詳細,如果通過的次數乘以這個你得叫這些對象的方法,那麼代碼變得難以管理。

+4

我希望用戶使用> 2000代表建議一個涉及泛型而不是窮人的更好的解決方案,至少你應該解釋這類解決方案的問題或者有一個Object類型的數組。 OP可以使用非員工類型的數組,它仍然可以使用泛型。 –

+0

我明白你的意思,但首先,由於這些建議已經在評論中給出,所以我覺得沒有必要立即重複。其次,即使OP的問題的前提是壞的,他的問題仍然缺乏關於演員的知識,所以我不認爲這是一件壞事,告訴他這樣的事情是可能的。但感謝您的評論,我將修改我的答案。 –

+0

問題不是特別的OP,其他人會看到這個答案,並學習一個不好的做法。明確的轉換是儘可能避免的,它引入了運行時可能在編譯時遇到的問題,否定了java被強類型化的好處。這也沒有邏輯上的意義,「看到我告訴你的對象是'對象'類型的嗎?我說謊了,它實際上是'員工'」。這種問題恰恰是當Java泛型的解釋能夠方便地幫助OP學習和在相同情況下的未來用戶時。 –

0

您的object[]裏面的所有對象都有getSalary()方法嗎?

  • 如果沒有,那麼你顯然可以看到編譯器爲什麼不讓你這樣做。如果最終出現這種情況,代碼中會出現一些有趣的事情。

  • 如果是,它可以是相同的getSalary()方法還是同一個類層次結構中同一方法的多個動態綁定實現?

    • 如果沒有,你應該做一個接口IHasSalary(跛腳的名字,我知道)公開這樣的方法,使所有這些對象實現該接口,然後聲明數組爲IHasSalary[]

    • 如果是,找到他們最專業的共同祖先,說它是類Employee,並宣佈數組爲Employee[]

+1

沒有什麼奇怪的。類Object沒有方法getSalary()。它必須被施放纔能有適當的方法。我同意儘管制定員工數組會更好。 – sage88

+0

@ sage88我在這句話中的含義是代碼的結構/邏輯有問題。這意味着如果你最終得到了一個對象的對象,你知道它是一些更專門化的類型,那麼你在某個地方做了一些奇怪的事情。 –

相關問題