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

时间:2019-02-18 17:00:48

标签: java kotlin extension-methods

我正在学习Kotlin,现在我正在阅读行动中的Kotlin 。 在阅读有关扩展功能和标准库改进的章节时,我了解了Java和Kotlin之间的String.split重载所暴露的不同行为:我认为在分隔符之间实现显式且由类型指导的分离是一个非常好的主意,基于和基于正则表达式的重载。

关于这一点,我在上面提到的书中说, 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中使用String值并从Kotlin到Java来回移动时,似乎(有些事情)发生了(魔术)。如果我没有正确理解,则Kotlin中的String文字是kotlin.String的实例,但是它们绑定到 Java类型,该类型透明地用于Java方法调用。这样Kotlin库可以在不影响String的情况下增强java.lang.String的体验:普通的Java [java.lang.]String.split方法在Kotlin开发人员可以看到{{1 }}实例及其方法。

因此,有两个(相关)问题:  1.我的理解正确吗?而且,更有趣  2.这只是编译器实施的一种魔术,它知道 [kotlin.]String作为 special 类型的实例并将它们包装在不同的类,还是有一些更通用的方法/机制可以某种方式隐藏或隐藏类,就像我们可以通过扩展函数机制添加方法一样?这可能非常危险,所以我认为这只是编译器的问题,但是它也可能功能强大,因此我认为值得提出这个问题。

提前感谢提示和反馈。

1 个答案:

答案 0 :(得分:4)

不幸的是,这是编译器魔术。它们被称为mapped types,并且编译器对其进行特殊处理,以使它们在Kotlin代码中像已修改接口的Kotlin类型一样可见,即使在运行时它们是常规Java类型的实例也是如此。到JVM。

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