Kotlin扩展功能-覆盖现有方法

时间:2018-10-02 13:48:27

标签: kotlin kotlin-extension

是否可以做类似的事情:

/**
 * 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(), 指扩展功能

是重命名扩展功能的唯一选择,还是可以从其中引用“超级”功能?

2 个答案:

答案 0 :(得分:4)

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

  

如果类具有成员函数,并且定义了扩展函数   具有相同的接收器类型,相同的名称适用于给定   争论,成员总是赢。

source

  

是重命名扩展功能的唯一选择,还是可以从其中引用“超级”功能?

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

答案 1 :(得分:1)

引用sourcepau1adam实际上只是说该成员在适用时才获胜。这意味着为可空类型toUpperCase()定义扩展函数String?是完全有效的。

  • 在非空toUppercase()上调用String时,将调用成员函数。
  • 在可为空的toUppercase()上调用String?时,没有成员函数。因此扩展功能被调用。

安全呼叫运营商?.实际上将this自动广播为非空String类型,因此您定义的函数确实可以实现您想要的功能。

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