亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

覆蓋子類型Kotlin / Java中的函數類型

覆蓋子類型Kotlin / Java中的函數類型

慕少森 2021-04-02 14:09:47
我有這個界面:// Interface for any simulation that is integrated against dtinterface SimulationState {    fun integrate(totalTime: Long, deltaTime: Long) : SimulationState    fun interpolate(alpha: Double, previousState: SimulationState) : SimulationState    fun preRender() : Collection<Pair<Int, Int>>}在這種情況下,實現與我的問題無關。問題是我可以覆蓋子類型中的函數類型嗎?下面是一個示例,該示例無法編譯;因此,我提出這個問題的原因。interface ShipState : SimulationState {    // Still in abstract, just hope I can somehow override the function type...    override fun integrate(totalTime: Long,                            deltaTime: Long,                           asteroidVectors: Collection<Pair<Double, Double>>) : SimulationState}希望上面公認的未編譯代碼能清楚表明我的意圖。Java / Kotlin是否可能?如果是這樣,我將如何處理?
查看完整描述

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。您只需將新方法添加到新接口,巧合的是,該接口看起來與另一個接口非常相似。但是,這種巧合并不意味著它是相同的方法。


查看完整回答
反對 回復 2021-04-14
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

也許你不需要override,但overload。

如果是,只需override從派生接口中刪除關鍵字。

如果需要override(將使用多態性),則兩個函數必須具有相同的簽名。

無法覆蓋該功能:

(Long, Long) -> SimulationState

具有功能:

(Long, Long, Collection) -> Unit


查看完整回答
反對 回復 2021-04-14
  • 2 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號