Mar*_*nna 1 dynamic dispatch kotlin
我刚刚开始探索Kotlin,我很好奇它超越了Java的核心动态绑定/调度语义.
假设我编写的代码看起来像这样:
class Animal {
fun add(x:Animal) = Animal()
}
object Horse : Animal
object Donkey : Animal
object Mule : Animal
fun Horse.add(x:Horse) = Horse()
fun Horse.add(x:Donkey) = Mule()
fun main(args : Array) {
val h:Animal = Horse
val d:Animal = Donkey
val child = h + d
}
基于上面的代码 - 我可以期待什么?我是否在运行时失败,因为Horse没有实现添加(动物)?它是否可以在上述性质的调用中准确区分它们,其中被比较的值的编译时类型是Animal(至少如编写),但它们的运行时类型更具体?如果我们使用var而不是val,它会改变什么吗?
提前致谢.
编辑:修改核心代码 - 我看到第一响应者强调的问题,我没有直接思考.显然我还没有编译过这个,我仍然在概念层面进行探索.
另外,我会在实际的编译器中给它一个镜头,但是我担心会出现它工作的情况和其他不基于我不完全理解的某些标准的情况.我无法找到关于如何在Kotlin中实现动态调度的参考文档(对于Java来说也不确定它是什么;几个月前我写了一些我认为可以基于JVM文档工作的东西,但它没有不,我从来没有机会探究到底为什么.
无论如何再次感谢!
所以这是一个实际编译的代码版本:
fun main(vararg args: String) {
val h:Animal = Horse
val d:Animal = Donkey
val child = h + d
println(child)
}
open class Animal {
fun plus(x:Animal) = Animal()
}
object Horse : Animal()
object Donkey : Animal()
object Mule : Animal()
fun Horse.plus(x:Horse) = Horse
fun Horse.plus(x:Donkey) = Mule
Run Code Online (Sandbox Code Playgroud)
结果是"Animal @ 1906bcf8".
据我所知,扩展方法,即Horse.plus(x:Horse)和Horse.plus(x:Donkey),是静态派遣的.那是因为它们被基本编译为与以下Java代码相同的字节代码:
static Horse plus(Horse $receiver, Horse x) {
return Horse.INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这与Java 8中的默认方法有很大的不同,它们是基于运行时类型动态调度的,可以被覆盖.
| 归档时间: |
|
| 查看次数: |
1141 次 |
| 最近记录: |