Kotlin:如何在扩展名中调用具有相同名称的方法?

时间:2019-01-11 09:13:48

标签: kotlin extension-methods

我写了一个startsWith(substring)扩展名,它也适用于可为空的字符串。不幸的是,我的执行导致StackOverflowError,导致扩展程序将自身称为自身,而不是String.startsWith(..)方法。

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

可以打String.startsWith(..)吗?

3 个答案:

答案 0 :(得分:3)

您可以使用import as语法以其他名称显式导入标准库的startsWith方法,然后可以使用该名称而不会发生冲突:

import kotlin.text.startsWith as ktStartsWith

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

答案 1 :(得分:1)

您可以这样写:

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

使用来自startsWith的{​​{1}}签名:

StringsJVM.kt

这样,通过将值显式传递给public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean 参数,
您避免了递归,因为您的扩展函数不再调用自身。

答案 2 :(得分:0)

您应该先执行空检查,然后将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不会调用您自己的扩展方法。