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

Pie*_*lli 5 java extension-methods kotlin

我正在学习Kotlin,现在我正在阅读Kotlin in Action。阅读有关扩展功能和标准库改进的章节,我了解了String.splitJava和Kotlin之间的重载所暴露出的不同行为:我认为在基于定界符和基于正则表达式之间进行显式且更多类型指导的分离是一个很好的主意。超载。

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

扩展功能响应问题“如何向现有类添加方法”;另一方面,我无法弄清楚如何隐藏 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中使用值以及从Kotlin到Java来回往返时,似乎(让我说)发生了一些魔术String。如果我对它的理解不正确,那么StringKotlin中的文字是的实例,kotlin.String但它们绑定到Java类型,该Java类型透明地用于Java方法调用。这样Kotlin库可以String在不增加影响的情况下提高体验java.lang.String:从Kotlin开发人员可以看到实例及其方法的角度来看,通常的Java [java.lang.]String.split方法对于Kotlin代码是隐藏的[kotlin.]String

因此,有两个(相关的)问题:1.我的理解正确吗?而且,更有趣2.它只能由编译器,这是一种神奇的落实到位知道 String S作为的情况下,特殊类型和包装它们不同的类的实例背后,还是有一些通用的方法/技工,允许以好歹隐藏类的一些方法,以同样的方式,我们可以通过扩展功能技工补充方法是什么?这可能非常危险,所以我认为这只是编译器的问题,但是它也可能功能强大,因此我认为值得提出这个问题。

在此先感谢您的提示和反馈。

zsm*_*b13 6

不幸的是,这是编译器的魔力。这些称为映射类型,并且编译器对其进行特殊处理,以使它们对于Kotlin代码而言像具有已修改接口的Kotlin类型一样可见,即使在运行时它们是编译为JVM时常规Java类型的实例也是如此。 。

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