当前位置: 首页 > 知识库问答 >
问题:

Kotlin动态/双派单的限制是什么?

萧麒
2023-03-14
    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没有实现add(Animal)而失败吗?在上述性质的调用中,被比较的值的编译时类型是动物的(至少,正如所写的那样),但它们的运行时类型更具体,它能准确地区分它们吗?如果我们使用var而不是val,这有什么改变吗?

提前道谢。

编辑:修改的核心代码--我看到了第一个响应者强调的问题,我没有正确地思考。显然,我还没有真正编译这个,我仍然是在一个概念层面上探索。

共有1个答案

司马昕
2023-03-14

下面是一个实际编译的代码版本:

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

结果是“动物@1906BCF8”。

据我理解,扩展方法,即horse.plus(x:hors)horse.plus(x:donkey)是静态调度的。这是因为它们基本上被编译成与以下Java代码相同的字节代码:

static Horse plus(Horse $receiver, Horse x) {
    return Horse.INSTANCE;
}
 类似资料:
  • 本文向大家介绍什么是双亲委派模型?相关面试题,主要包含被问及什么是双亲委派模型?时的应答技巧和注意事项,需要的朋友参考一下 在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它的类加载器和这个类本身统一确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。 类加载

  • 如果一个类收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器执行,如果父加载器还存在其父加载器,则进一步向上委托,依次递归,请求将最终到达顶层的启动类加载器,如果父类加载器可以完成父加载任务,就成功返回,如果父加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派模型。 双亲委派模式的优势: 避免重复加载; 考虑到安全因素,java核心api中定义类型不会被随意替

  • 问题内容: 有一个使用-情况我从来没见过漂亮的实现。 是或多或少的静态结构。将Pages添加到右侧(添加到Model并显示它)并不难,但是,应该有一个很好用的解决方案来扩展PagerAdapter(或其某些子类),以便它可以双向扩展。 我可以想象这样的适配器接口 与Collections Iterator相似,但是是双向的。 其中索引/位置不限于0以下,而是可以使用Integer类型的整个范围。

  • 我发现这个问题和另一个问题非常有趣,至少对我来说,它引出了几个问题: 这是一个相当开放的问题,局限于哪里?显然,GUI应用程序不适用于解决方案或IDE替换: 图形界面和调试器支持超出了范围。JShell API旨在允许在IDE和其他工具中使用JShell功能,但JShell工具并不打算成为IDE。 维恩图或其他视觉效果的加分。 当然,代码片段的大小应该受到限制。我更多的是问什么样的问题不能用片段来

  • 我们正在使用多个Kafka主题,但希望优先考虑其中一些主题(~服务质量)。 根据我在网上找到的,共识是不要限制运算符,而是限制源,更具体地说是反序列化器[1]。 我们如何访问源中有关流媒体环境状态的信息(即主题落后于当前偏移量的程度)。 目前,我们计划将我们的整个设置转换为CoFlatMaps[2],并拥有一个控制流,该控制流为所有主题发出当前偏移滞后-低优先级流运算符,然后根据高优先级流的滞后H

  • 有人能详细说明酒吧/子系统实施的动态费率限制吗?我在gcloud文档或faq页面上找不到任何细节。 下面是我的pubsub用法:我计划在我们的生产中使用pubsub。现在,我有1个主题、1个订阅和1个订阅者(Webhook HTTPS回调)。有时我的订阅者可能会抛出异常(非常少),在这种情况下,我的订阅者将返回一个400响应给pubsub,以便pubsub可以保留消息并重试。 如果pubsub从用