【问题标题】:Kotlin Extension Functions - Override existing methodKotlin 扩展函数 - 覆盖现有方法
【发布时间】:2018-10-02 13:48:27
【问题描述】:

是否可以这样做:

/**
 * Converts all of the characters in the string to upper case.
 *
 * @param str the string to be converted to uppercase
 * @return the string converted to uppercase or empty string if the input was null
 */
fun String?.toUpperCase(): String = this?.toUpperCase() ?: ""
  • 这会做什么?这将使toUpperCase null 安全。
  • 我有什么问题?返回值,this?.toUpperCase(), 指扩展功能

是重命名我的扩展函数的唯一选择,还是有办法从其中引用“超级”函数?

【问题讨论】:

  • 假设有一种方法可以实现这一点,那将是模棱两可的,对吧?如果我这样做 "foo".toUpperCase() 会调用哪个方法?
  • 我会假设扩展功能....但直到现在我还没有考虑过
  • 我的意思是,toUpperCase 已经是 Kotlin 中的扩展方法了。

标签: kotlin kotlin-extension


【解决方案1】:

您不能覆盖现有的成员函数。

如果一个类有一个成员函数,并且定义了一个扩展函数 具有相同的接收者类型,相同的名称适用于给定 论点,成员总是获胜。

source

是重命名我的扩展函数的唯一选项,还是有办法从其中引用“超级”函数?

您必须重命名您的扩展函数并从内部调用您要使用的成员函数。

【讨论】:

    【解决方案2】:

    source 作为pau1adam 引用实际上仅表示当会员适用时会员获胜。这意味着为可空类型String? 定义扩展函数toUpperCase() 是完全有效的。

    • 在非空String 上调用toUpperCase() 时,会调用成员函数。
    • 在可空的String? 上调用toUpperCase() 时,没有成员函数。因此调用了扩展函数。

    安全调用运算符?. 实际上将this 自动转换为非空String 类型,因此您定义的函数完全符合您的要求。

    您可以在source 上找到更多详细信息,其中解释了如何实现Any?.toString()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多