Доступ к статической функции расширения из другого класса в Kotlin?

Допустим, у нас есть следующая функция расширения:

class Helper {
  companion object {
    fun Int.plus(value: String) = Integer.valueOf(value).plus(this)
  }

}

Как вы можете получить доступ к plus Функция расширения от Helper класс в другом классе. Есть ли способ, где мы можем сделать что-то вроде этого, например:

class OtherClass {
  fun someMethod() {
    val eight = 7.Helper.Companion.plus("1")
  }

}

2 ответа

В вашем примере Int.plus(value: String) является функцией-членом Helper.Companion объект (факт, что это объект-компаньон или что он находится внутри другого класса, не имеет значения). Этот случай описан в разделе " Объявление расширений в качестве участников " документации.

Короче говоря, для доступа к функции с двумя приемниками (дополнительный приемник типа Int и диспетчер отправки типа Helper.Companion) вы должны иметь их обоих в объеме.

Это может быть достигнуто несколькими способами:

with(Helper.Companion) {
    239.plus("")
}

или же

with(Helper.Companion) {
    with(239) {
        plus("")
    }
}

PS Помещение функции расширения в объект-компаньон очень нерегулярно и не идиоматично. Я не могу себе представить, зачем вам это нужно.

Расширение объявлено как это member extension function и будет виден только внутри Helper учебный класс. Если вам нужно получить доступ к нему за пределами этого класса, поместите его в более широкую область, например, сделайте его функцией верхнего уровня. В качестве альтернативы вы можете сделать ее обычной функцией, которая принимает два параметра, если вы хотите сохранить ее в классе.


В качестве дополнительной подсказки вы можете отметить эту функцию как operatorесли вы хотите использовать его с + условное обозначение:

operator fun Int.plus(value: String) = Integer.valueOf(value) + this

val x = 2 + "25"
Другие вопросы по тегам