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