有没有一种方法可以在Kotlin中隐藏Java方法?

7
我正在学习Kotlin,这几天在阅读《Kotlin in Action》一书。在阅读有关扩展函数和标准库改进的章节时,我了解到Java和Kotlin之间的String.split重载存在不同的行为:我认为向基于分隔符和基于正则表达式的重载之间明确并更具类型导向的区分是一个非常好的想法。
关于这一点,《Kotlin in Action》一书提到:Kotlin隐藏了令人困惑的方法,并提供了几个重载扩展名为split的替代方法
扩展函数回答了“如何向现有类添加方法”的问题。另一方面,我无法想象如何隐藏 Java Standard Library 提供的方法
我尝试编写了一些简单的代码,发现:
  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之间来回传递时,似乎发生了(让我说)某些神奇的事情。如果我理解正确,Kotlin中的String文字是kotlin.String的实例,但它们与用于Java方法调用的Java类型绑定。这样,Kotlin库就可以增强String体验,而不影响java.lang.String。通常情况下,Java的[java.lang.]String.split方法对于Kotlin代码是隐藏的,因为Kotlin开发人员只看到[kotlin.]String实例及其方法。
所以,有两个(相关的)问题: 1. 我的理解正确吗?更有趣的是 2. 它只是编译器放置的一种魔法,它将String作为一种特殊类型的实例,并将它们包装在不同类的实例后面,还是有一些更通用的方法/机制,可以以某种方式隐藏类的某些方法,就像我们可以通过扩展函数机制添加方法一样?这可能非常危险,所以我认为这只是编译器的问题,但它也可能非常强大,所以我认为这个问题很值得探讨。
提前感谢您的提示和反馈。
1个回答

8

很遗憾,这是编译器的魔法。它们被称为映射类型,编译器会给予它们特殊处理,使它们在 Kotlin 代码中可见,作为已修改接口的 Kotlin 类型,尽管在编译成 JVM 时,它们实际上是常规 Java 类型的实例。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接