Kotlin:如何在扩展中调用同名方法?

Kotlin: How to call a method with the same name in an extension?

我写了一个 startsWith(substring) 扩展,它也适用于可为 null 的字符串。不幸的是,我的实现导致 WhosebugError 导致扩展调用它自己而不是 String.startsWith(..) 方法。

private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub)==true

是否可以调用 String.startsWith(..)

你应该先做空检查,然后调用startsWith给非空String。这是一个使用 run:

的例子
private fun String?.startsWith(sub: String, ignoreCase: Boolean = false): Boolean = this?.run{startsWith(sub, ignoreCase)} ?: false

块内 this?.run{ /* this is non-null inside here */}。所以在里面调用startsWith不会调用自己的扩展方法

你可以这样写:

private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub, false) == true

使用 startsWith 来自 StringsJVM.kt 的签名:

public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean

这样,通过显式将值传递给 ignoreCase 参数,
您避免递归,因为您的扩展函数不再调用自身。

您可以使用 import as 语法以不同的名称显式导入标准库的 startsWith 方法,这样您就可以使用而不会发生冲突:

import kotlin.text.startsWith as ktStartsWith

private fun String?.startsWith(sub: String): Boolean = this?.ktStartsWith(sub) == true