gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:46 25 4
gpt4 key购买 nike

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

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

扩展函数响应“如何向现有类添加方法”的问题;另一方面,我不知道如何隐藏 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方法,接收到的参数xx.getClass().getName() == "java.lang .String"(如预期)
  4. String js = "Pietro Martinelli"(在 Java 代码中)有 js.getClass().getName() == "java.lang.String",作为预计
  5. 将上面的 js 值传递给 Kotlin 方法,接收到的参数 yy::class.qualifiedName == "kotlin.String"y.getClass().getName() == "java.lang.String"(如预期)

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

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

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

最佳答案

不幸的是,这是编译器的魔法。这些被称为 mapped types ,并且编译器对它们进行特殊处理,以便它们作为具有修改接口(interface)的 Kotlin 类型对 Kotlin 代码可见,即使在运行时它们在编译到 JVM 时是常规 Java 类型的实例。

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

关于java - 有没有办法在 Kotlin 中隐藏 Java 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54752096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com