2 回答

TA貢獻1895條經驗 獲得超3個贊
JVM對象結構具有指向可用方法表的內部指針。當您調用對象的方法時,JVM會訪問該表(將其稱為vtable),如果找到了方法,它將執行該表。但是,如果那里沒有找到方法怎么辦?然后,它嘗試在父類中找到此方法??梢栽诰幾g期間檢測到這些訪問,這有助于避免在運行時調試時出現非常復雜的問題。
現在,讓我們想象您的例子是可能的。您有一個實現的類,ShipState并且通過它也實現了SimulationState。您可以integrate通過接口ShipState(帶有3個參數的接口)實現您的方法。
但是等等,您的對象仍然是類型SimulationState,對嗎?現在,讓我們假設您想創建一組仿真并以單一方式處理它們:
val simpleSimulation = SimulationStateImpl() //imaginary implementation of base interface
val shipSimulation = ShipSimulationImpl() // again imaginary implementation
val simulations = listOf<SimulationState>(simpleSimulation, shipSimulation)
simulations.forEach { it.integrate(totalTime = 100, deltaTime = 50) }
接下來發生什么?在第一次迭代中,一切都很好。當你調用integrate的simpleSimulationJVM訪問它的虛函數表,發現執行integrate與兩個參數并調用它。美好的。
在第二次迭代中,JVM訪問object的vtable shipSimulation。它嘗試解析integrate帶有兩個參數的方法,但沒有找到它。好吧,下一步該怎么做?有類似的方法具有三個參數,我們應該調用它嗎?如果是,我們需要傳遞哪個參數?null?為什么?如果您的類似方法多了5個參數,該怎么辦?編譯器和運行時無法解決此問題,這就是失敗的原因。
就Java / Kotlin OOP而言,您要做的不是override。您只需將新方法添加到新接口,巧合的是,該接口看起來與另一個接口非常相似。但是,這種巧合并不意味著它是相同的方法。

TA貢獻1847條經驗 獲得超11個贊
也許你不需要override
,但overload
。
如果是,只需override
從派生接口中刪除關鍵字。
如果需要override
(將使用多態性),則兩個函數必須具有相同的簽名。
無法覆蓋該功能:
(Long, Long) -> SimulationState
具有功能:
(Long, Long, Collection) -> Unit
添加回答
舉報