gpt4 book ai didi

java - 重写 Kotlin/Java 子类型中的函数类型

转载 作者:行者123 更新时间:2023-12-02 02:05:16 25 4
gpt4 key购买 nike

我有这个界面:

// Interface for any simulation that is integrated against dt
interface 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 可以做到这一点吗?如果是这样,我该怎么办?

最佳答案

JVM 对象结构有一个指向可用方法表的内部指针。当你调用对象的方法时,JVM 会访问这个表(我们称之为 vtable),如果找到方法,就会执行它。但是如果那里没有找到方法怎么办?然后它尝试在父类中找到这个方法。这些访问可以在编译期间被检测到,这有助于避免运行时调试时出现真正复杂的问题。

现在,让我们想象一下您的示例是可能的。您有一个实现 ShipState 的类,并且通过它,它还实现了 SimulationState。您可以从接口(interface) ShipState(具有 3 个参数的接口(interface))实现方法 integrate

但是等等,您的对象仍然是 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) }

接下来会发生什么?在第一次迭代中,一切都很好。当您在 simpleSimulation JVM 上调用 integrate 访问它的 vtable 时,会找到带有两个参数的 integrate 实现并调用它。很好。

在第二次迭代中,JVM 访问对象 shipSimulation 的 vtable。它尝试解析带有两个参数的方法integrate,但没有找到它。好吧,接下来做什么?还有类似的方法,它有三个参数,我们应该调用它吗?如果是,我们需要传递哪个参数? ?为什么?如果你的类似方法多了 5 个参数怎么办?编译器和运行时无法解决此问题,这就是它失败的原因。

就 Java/Kotlin OOP 而言,您想要做的不是覆盖。您只需将新方法添加到新接口(interface)中,巧合的是,该接口(interface)看起来与另一个接口(interface)非常相似。然而,这种巧合并不意味着它是相同的方法。

请查看this wonderful article ,它以低级细节解释了主题。

关于java - 重写 Kotlin/Java 子类型中的函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50935508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com