【问题标题】:Is there a way to hide Java methods in Kotlin?有没有办法在 Kotlin 中隐藏 Java 方法?
【发布时间】:2019-02-18 17:00:47
【问题描述】:

我正在学习 Kotlin,并且我最近正在阅读 Kotlin in Action。 阅读关于扩展函数和标准库改进的章节,我读到了 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 库可以在不影响 java.lang.String 的情况下增强 String 体验:通常的 Java [java.lang.]String.split 方法对 Kotlin 代码隐藏,因为 Kotlin 开发人员可以看到 [kotlin.]String 实例及其方法。

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

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

【问题讨论】:

    标签: java kotlin extension-methods


    【解决方案1】:

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

    除了String,最值得注意的例子可能是集合,它们应用了两层全新的接口,用于只读和可变变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 2021-09-02
      • 1970-01-01
      • 2016-01-18
      • 2015-12-11
      • 2021-04-28
      • 2019-01-23
      • 2015-04-01
      相关资源
      最近更新 更多