Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写子类型Kotlin/Java中的函数类型_Java_Kotlin - Fatal编程技术网

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

重写子类型Kotlin/Java中的函数类型,java,kotlin,Java,Kotlin,我有这个界面: // Interface for any simulation that is integrated against dt interface SimulationState { fun integrate(totalTime: Long, deltaTime: Long) : SimulationState fun interpolate(alpha: Double, previousState: SimulationState) : SimulationSta

我有这个界面:

// 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>>
}
//针对dt集成的任何模拟的接口
接口模拟状态{
乐趣积分(总时间:长,deltaTime:长):模拟状态
有趣的插值(alpha:Double,previousState:SimulationState):SimulationState
fun preRender():集合
}
在这种情况下,实现与我的问题无关。问题是我能否覆盖子类型中的函数类型。下面是一个未编译的示例;因此,我提出这个问题的理由

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
}
接口ShipState:SimulationState{
//还是抽象的,只是希望我能以某种方式重写函数类型。。。
覆盖乐趣积分(总时间:长,
德尔塔蒂姆:长,
矢量:集合):SimulationState
}

希望上面不编译的代码能清楚地表明我的意图。这在Java/Kotlin中可能吗?如果是这样,我该怎么做呢?

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

现在,让我们假设您的示例是可能的。您有一个类,它实现了
ShipState
,并通过它实现了
SimulationState
。您可以从接口
ShipState
(具有3个参数的接口)实现方法
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) }
val simpleSimulation=SimulationStateImpl()//基本接口的虚拟实现
val shipSimulation=ShipSimulationImpl()//还是虚拟实现
val模拟=列表(simpleSimulation,shipSimulation)
simulations.forEach{it.integrate(totalTime=100,deltaTime=50)}
接下来会发生什么?在第一次迭代中,一切正常。在
simpleSimulation
JVM访问上调用
integrate
时,它是vtable,使用两个参数查找
integrate
的实现并调用它。好的

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

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


请看一看,它以低级细节解释了主题。

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

现在,让我们假设您的示例是可能的。您有一个类,它实现了
ShipState
,并通过它实现了
SimulationState
。您可以从接口
ShipState
(具有3个参数的接口)实现方法
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) }
val simpleSimulation=SimulationStateImpl()//基本接口的虚拟实现
val shipSimulation=ShipSimulationImpl()//还是虚拟实现
val模拟=列表(simpleSimulation,shipSimulation)
simulations.forEach{it.integrate(totalTime=100,deltaTime=50)}
接下来会发生什么?在第一次迭代中,一切正常。在
simpleSimulation
JVM访问上调用
integrate
时,它是vtable,使用两个参数查找
integrate
的实现并调用它。好的

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

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


请看一看,它以低级细节解释了主题。

您可能不需要
覆盖
,而是
重载

如果是,只需从派生接口中删除关键字
override

如果需要重写(将使用多态性),则两个函数必须具有相同的签名

无法覆盖该功能:

(Long, Long) -> SimulationState
(Long, Long, Collection) -> Unit
具有以下功能:

(Long, Long) -> SimulationState
(Long, Long, Collection) -> Unit

可能您不需要
覆盖<