我有一個內部有對象的數組。我將如何使用數組元素的方法?我的數組是Object
。我試過array[i].getSalary()
,但這不起作用。從一個數組中的類中調用方法
回答
首先,你應該幾乎從不使用數組Object
。原因是,你失去了所有類型的信息:
- 會使代碼更易於理解的人誰都會閱讀你的代碼(包括你的教授,自己,自己在半年的時候你會忘記了一切代碼)
- 可以被編譯器和IDE用來告訴你什麼時候你在測試程序之前犯了錯誤。
- 將避免在本答案的第二部分中我將向您解釋的容易出錯的轉換類型。
而不是使用Object
的數組,請使用與將放入其中的對象(或公共基類)相對應的類型的數組。假設你的類叫做Employee
,您應該聲明的數組是這樣的:
Employee[] employeeArray;
(employeeArray
比array
一個更好的名字,因爲它告訴什麼樣的對象包含,再次可讀性一般,喜歡明確的。變量的名稱。)
如果類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()!");
}
但是你看,它變得更加詳細,如果通過的次數乘以這個你得叫這些對象的方法,那麼代碼變得難以管理。
我希望用戶使用> 2000代表建議一個涉及泛型而不是窮人的更好的解決方案,至少你應該解釋這類解決方案的問題或者有一個Object類型的數組。 OP可以使用非員工類型的數組,它仍然可以使用泛型。 –
我明白你的意思,但首先,由於這些建議已經在評論中給出,所以我覺得沒有必要立即重複。其次,即使OP的問題的前提是壞的,他的問題仍然缺乏關於演員的知識,所以我不認爲這是一件壞事,告訴他這樣的事情是可能的。但感謝您的評論,我將修改我的答案。 –
問題不是特別的OP,其他人會看到這個答案,並學習一個不好的做法。明確的轉換是儘可能避免的,它引入了運行時可能在編譯時遇到的問題,否定了java被強類型化的好處。這也沒有邏輯上的意義,「看到我告訴你的對象是'對象'類型的嗎?我說謊了,它實際上是'員工'」。這種問題恰恰是當Java泛型的解釋能夠方便地幫助OP學習和在相同情況下的未來用戶時。 –
您的object[]
裏面的所有對象都有getSalary()
方法嗎?
如果沒有,那麼你顯然可以看到編譯器爲什麼不讓你這樣做。如果最終出現這種情況,代碼中會出現一些有趣的事情。
如果是,它可以是相同的
getSalary()
方法還是同一個類層次結構中同一方法的多個動態綁定實現?如果沒有,你應該做一個接口
IHasSalary
(跛腳的名字,我知道)公開這樣的方法,使所有這些對象實現該接口,然後聲明數組爲IHasSalary[]
。如果是,找到他們最專業的共同祖先,說它是類
Employee
,並宣佈數組爲Employee[]
。
沒有什麼奇怪的。類Object沒有方法getSalary()。它必須被施放纔能有適當的方法。我同意儘管制定員工數組會更好。 – sage88
@ sage88我在這句話中的含義是代碼的結構/邏輯有問題。這意味着如果你最終得到了一個對象的對象,你知道它是一些更專門化的類型,那麼你在某個地方做了一些奇怪的事情。 –
- 1. Python - 從一個類中調用一個類中的方法
- 2. 從Python 2.7中的另一個類方法調用類方法
- 3. PHP:從數組中調用一個類?
- 4. 如何從另一個類中的一個類調用方法
- 5. 如何從一個類中調用另一個類的方法?
- 6. 如何從另一個類中的一個類調用方法
- 7. 存儲和調用/特定類的方法從一個數組
- 8. 從另一個類中調用MainActivity類中的方法
- 9. 從同一個類中的方法調用方法
- 10. 從另一個類中的方法調用方法
- 11. 從同一個PHP類中的另一個方法調用一個方法
- 12. 從一個類中調用一個方法並在另一個類中使用
- 13. 從同一個類中的方法調用構造函數
- 14. 從另一個具有參數的類中調用方法
- 15. 如何從Android的另一個類中調用一個方法
- 16. Android從另一個類中的方法調用一個Intent
- 17. 從另一個類調用類方法
- 18. 從另一個類調用類方法..
- 19. 從另一個類調用類方法?
- 20. 調用同一個類中的方法
- 21. 調用同一個類中的方法?
- 22. 從(MainActivity.java)中的按鈕調用另一個類中的方法
- 23. 僅從類中調用一次方法
- 24. 從類中調用方法
- 25. 如何從另一個類的靜態類中調用方法?
- 26. 如何從調用類的方法中另一個類
- 27. 從另一個類調用Activity類中的公共方法?
- 28. 如何從另一個類中調用一個類中的方法
- 29. Ocaml如何從另一個類中調用一個類中的方法
- 30. 我無法從類中調用數組
你可以投,但我求你不要。不要讓你的數組類型的對象,使其通用。 –
+1。解決方案是讓你的數組不是'Object []'類型,而是'Employee []'類型'或其他類型。 –
我明白,但我們的教授要求它是Object類型。 – Infodayne