Котлин: Как вызвать метод с тем же именем в расширении? - PullRequest
0 голосов
/ 11 января 2019

Я написал расширение startsWith(substring), которое применимо и к обнуляемым строкам. К сожалению, моя имплантация приводит к StackOverflowError, потому что расширение вызывает его сам, а не String.startsWith(..) метод.

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

Можно ли позвонить String.startsWith(..)?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Вы можете написать это так:

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,
вы избегаете рекурсии, потому что ваша функция расширения больше не вызывает сама себя.

0 голосов
/ 11 января 2019

Синтаксис import as можно использовать для явного импорта метода startsWith стандартной библиотеки с другим именем, которое затем можно использовать без конфликта:

import kotlin.text.startsWith as ktStartsWith

private fun String?.startsWith(sub: String): Boolean = this?.ktStartsWith(sub) == true
0 голосов
/ 11 января 2019

Сначала вы должны проверить NULL, затем вызвать 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 изнутри не вызовет ваш собственный метод расширения.

...