Скажем, мне нужно целое число, которое предоставляет метод square
.
Котлин:
fun Int.square() = this * this
использование:
println("${20.square()}")
док:
Расширения фактически не изменяют классы, которые они расширяют. Определяя расширение, вы не вставляете новые члены в класс, а просто делаете новые функции вызываемыми с точечной нотацией для переменных этого типа.
Мы хотели бы подчеркнуть, что функции расширения отправляются статически.
Я ожидал, что они просто добавят его к функциям-членам расширенного класса во время компиляции, но это то, что они явно отрицают, поэтому моей следующей мыслью было что-то вроде scala implits.
Scala:
object IntExtensions{
implicit Class SquareableInt(i:Int){
def square = i*i
}
}
использование:
import IntExtensions._
а потом
println(f"${20.square}")
док:
Неявный класс разделяется на пары класса и неявного метода, где метод implciit имитирует конструктор класса.
Созданный неявный метод будет иметь то же имя, что и неявный класс.
Но scala неявно создает новый класс, который отключит использование this
.
Итак ... как же Kotlin расширяет классы? Make callable мне мало что говорит.