假設我有一個接口Vehicle
和實現Car
。類Car
有一個名爲getNumberCylinders()
的方法,它不是Vehicle
接口的一部分。因此在我的代碼中,我需要將一個Vehicle
實例投射到Car
類中,以調用此方法。從接口到實現類的鑄造性能開銷
難道這樣的投招致性能開銷,對包括該方法進入界面,並直接調用該方法,無需投的選擇嗎?
假設我有一個接口Vehicle
和實現Car
。類Car
有一個名爲getNumberCylinders()
的方法,它不是Vehicle
接口的一部分。因此在我的代碼中,我需要將一個Vehicle
實例投射到Car
類中,以調用此方法。從接口到實現類的鑄造性能開銷
難道這樣的投招致性能開銷,對包括該方法進入界面,並直接調用該方法,無需投的選擇嗎?
如果您認爲所有車輛都應該有'氣缸數',那麼最好將該方法添加到車輛接口。否則,鑄造完全沒問題。在運行時,轉換根本不會修改你的對象。鑄造更多的與編譯檢查有關。 雖然Java規範本身並不能保證它的運行時間爲0納秒,但由於轉換操作而導致的性能開銷沒有明顯的報告。 在我的應用程序中,我將更多地關注不必要的數據庫命中和對象創建,而不僅僅是類型轉換。
這樣的演員是否會導致性能開銷,而不是將此方法包含在接口中並直接調用該方法而不進行演員表演?
在這種情況下,是的,因爲對象可能不是一個車,所以Java必須做一個運行時檢查,這是ClassCastExceptions異常如何拋出。 JVM規範#2.6.8。
如果你必須做這種事情,你通常在設計階段做錯了事情。我會重新考慮你的對象模型。
在運行時,Casting不會執行任何操作。 –
@DavidWallace所以鑄造會有0納秒性能打擊? – user2763361
如果'Vehicle'是一個接口,那麼就不會有像「Vehicle'實例」那樣的東西。這裏有一個實現'Vehicle'的類的實例。 –