有没有办法在 Kotlin 中隐藏 Java 方法?

Is there a way to hide Java methods in Kotlin?

我正在学习 Kotlin,这几天我正在阅读 Kotlin in Action。 阅读关于扩展函数和标准库改进的章节,我读到了 Java 和 Kotlin 之间 String.split 重载所暴露的不同行为:我认为转向显式和更多类型引导是一个非常好的主意基于定界符和基于正则表达式的重载之间的分离。

关于这一点,我上面提到的那本书说 Kotlin 隐藏了令人困惑的方法,并提供了几个名为 split 的重载扩展作为替换,这些扩展具有不同的参数

扩展功能回复问题"How can I add method to an existing class";另一方面,我不知道如何 隐藏 标准库 Java 提供的方法

我尝试编写简单的代码,我注意到

  1. val ks = "Pietro Martinelli"ks::class.qualifiedName == "kotlin.String"
  2. val ks = "Pietro Martinelli"ks::javaClass.name == "java.lang.String"
  3. 将上述值 ks 传递给 Java 方法,接收到的参数 x 具有 x.getClass().getName() == "java.lang.String"(如预期)
  4. String js = "Pietro Martinelli"(在 Java 代码中)有 js.getClass().getName() == "java.lang.String",如预期的那样
  5. 将上述 js 值传递给 Kotlin 方法,接收到的参数 y 具有 y::class.qualifiedName == "kotlin.String"y.getClass().getName() == "java.lang.String"(目前预期)

所以:似乎(让我说)当我在 Kotlin 中使用 String 值并在 Kotlin 和 [=84= 之间来回使用时, 发生了一些神奇的事情 ].如果我理解正确,Kotlin 中的 String 文字是 kotlin.String 的实例,但它们被绑定到透明地用于 Java 方法调用。这样 Kotlin 库可以在不影响 java.lang.String 的情况下增强 String 体验:通常的 Java [java.lang.]String.split 方法在某种意义上对 Kotlin 代码是 hidden Kotlin 开发人员看到 [kotlin.]String 个实例及其方法。

所以,两个(相关)问题: 1.我的理解对吗?而且,更有趣 2. 这只是编译器设置的一种魔法,它 知道 String 作为 special 类型的实例,并且将它们包装在不同 class 的实例后面,或者是否有一些更通用的 approach/mechanic 允许以某种方式 hide class 相同的某些方法我们可以通过扩展功能机制添加方法吗?它可能非常危险,所以 我认为这只是编译器的问题,但它也可能很强大,所以我认为值得一提。

提前感谢您的提示和反馈。

不幸的是,这是编译器的魔法。这些被称为 mapped types,编译器对它们进行特殊处理以使其对 Kotlin 代码可见,因为它们是具有修改接口的 Kotlin 类型,即使在运行时它们是常规 [=16= 的实例] 编译到 JVM 时的类型。

除了 String 之外,最著名的例子可能是集合,它们应用了两层全新的接口,用于只读和可变变体。