Функции расширения Kotlin - переопределить существующий метод - PullRequest
0 голосов
/ 02 октября 2018

возможно ли сделать что-то вроде:

/**
 * 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 ноль безопасным.
  • Какая у меня проблема?возвращаемое значение, this?.toUpperCase(), относится к функции расширения

Является единственной возможностью переименовать мою функцию расширения или есть способ обратиться к функции "super" из нее

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

source as pau1adam цитирует, фактически только говорит, что участник выигрывает, когда участник применим.Это означает, что определение функции расширения toUpperCase() для обнуляемого типа String? полностью допустимо.

  • При вызове toUppercase() для ненулевого String вызывается функция-член.
  • При вызове toUppercase() для обнуляемого String? функция-член отсутствует.Таким образом, вызывается функция расширения.

Оператор безопасного вызова ?. фактически автоматически передает this в ненулевой тип String, поэтому определенная вами функция делает именно то, что вам нужно.

Более подробную информацию можно найти в источнике , где объясняется, как можно реализовать Any?.toString().

0 голосов
/ 02 октября 2018

Вы не можете переопределить существующую функцию-член.

Если у класса есть функция-член и определена функция расширения с тем же типом получателя, то же имя применимо к заданным аргументам,участник всегда побеждает.

source

Это единственный вариант переименовать мою функцию расширения или есть способ обратиться к "супер"функция изнутри?

Вам нужно будет переименовать вашу функцию расширения и вызвать функцию-член, которую вы хотите использовать изнутри.

...