【发布时间】:2019-02-18 17:00:47
【问题描述】:
我正在学习 Kotlin,并且我最近正在阅读 Kotlin in Action。
阅读关于扩展函数和标准库改进的章节,我读到了 Java 和 Kotlin 之间 String.split 重载所暴露的不同行为:我认为在基于分隔符和基于正则表达式的重载。
关于这一点,我上面提到的书说,Kotlin 隐藏了令人困惑的方法,并提供了几个名为 split 的重载扩展作为替代,它们具有不同的参数。
扩展函数响应问题“如何将方法添加到现有类”;另一方面,我不知道如何隐藏 Java 标准库提供的方法。
我尝试过写一些简单的代码,我注意到了
-
val ks = "Pietro Martinelli"有ks::class.qualifiedName == "kotlin.String" -
val ks = "Pietro Martinelli"有ks::javaClass.name == "java.lang.String" - 将上面的值
ks传递给Java方法,接收到的参数x有x.getClass().getName() == "java.lang.String"(如预期) -
String js = "Pietro Martinelli"(在 Java 代码中)有js.getClass().getName() == "java.lang.String",正如预期的那样 - 将上述
js值传递给Kotlin 方法,接收到的参数y具有y::class.qualifiedName == "kotlin.String"和y.getClass().getName() == "java.lang.String"(目前为止预期)
所以:当我在 Kotlin 中使用 String 值以及从 Kotlin 到 Java 来回切换时,似乎(让我说)某种魔法。如果我理解正确,Kotlin 中的 String 文字是 kotlin.String 的实例,但它们绑定到一个 Java 类型,该类型透明地用于 Java 方法调用。这样,Kotlin 库可以在不影响 java.lang.String 的情况下增强 String 体验:通常的 Java [java.lang.]String.split 方法对 Kotlin 代码隐藏,因为 Kotlin 开发人员可以看到 [kotlin.]String 实例及其方法。
所以,两个(相关)问题:
1.我的理解对吗?而且,更有趣
2. 这只是编译器的一种魔法,它知道 Strings 是 special 类型的实例,并将它们包装在不同类的实例后面,还是有一些更通用的方法/机制允许以某种方式隐藏类的某些方法,就像我们可以通过扩展函数机制添加方法一样?它可能非常危险,所以我认为这只是编译器的问题,但它也可能很强大,所以我认为值得提出这个问题。
提前感谢您的提示和反馈。
【问题讨论】:
标签: java kotlin extension-methods