Intereting Posts
Как написать скобки Java «» в Котлин? Как работают функции высшего порядка Котлина? Функция хвоста Котлина Как написать надлежащий тест для реактивного репозитория интерфейса, который возвращает Observable только в том случае, когда есть какое-то событие, как издеваться над запуском этого события Язык Kotlin получает класс во время выполнения Проверьте, является ли класс допустимым значением для KParameter поддерживает Lollipop в Котлине Kotlin – присвоить значение переменной enum переменной без значения. Как получить ссылку на класс от KParameter в котлин? Можно ли создать приложение для Android, которое использует Kotlin с make или Soong? UNRESOLVED_REFERENCE в виджетах (TextView) разрешен элемент ошибки в android-kotlin Исправление некоторых синтаксиса Котлина Вложенные лямбда-звонки в Котлин Котлинский эквивалент Java String.getBytes () Есть ли чистый способ использования методов расширения Groovy в Котлине?

Вызов оператора и перегрузка оператора в Котлине

Я узнаю об операторе Invoke, который,

a() эквивалентно a.invoke()

Есть ли что-то еще относительно оператора Invoke, пожалуйста, объясните. Кроме того, у меня не было никакого примера перегрузки оператора Invoke.

Возможно ли перегрузка оператора Invoke? Если возможно, тогда кто-нибудь может объяснить о перегрузке оператора Invoke примером. Я ничего не понял по этому поводу.

Заранее спасибо.

Да, вы можете перегрузить invoke . Вот пример:

 class Greeter(val greeting: String) { operator fun invoke(target: String) = println("$greeting $target!") } val hello = Greeter("Hello") hello("world") // Prints "Hello world!" 

В дополнение к тому, что сказал @ holi-java, переопределение invoke полезно для любого класса, где есть четкое действие, необязательно принимая параметры. Это также отлично, как функция расширения классов библиотеки Java с таким методом.

Например, скажем, у вас есть следующий класс Java

 public class ThingParser { public Thing parse(File file) { // Parse the file } } 

В Kotlin вы можете определить расширение на ThingParser следующим образом:

 operator fun ThingParser.invoke(file: File) = parse(file) 

И используйте его так

 val parser = ThingParser() val file = File("path/to/file") val thing = parser(file) // Calls Parser.invoke extension function 

Самый лучший способ использования оператора invoke – использовать его как Factory Method , например:

 // v--- call the invoke(String) operator val data1 = Data("1") // v--- call the invoke() operator val default = Data() // v-- call the constructor val data2 = Data(2) 

Это связано с тем, что объект-компаньон является специальным объектом в Котлине. Действительно, приведенный выше код Data("1") переводится в код, как показано ниже:

 val factory:Data.Companion = Data // v-- the invoke operator is used here val data1:Data = factory.invoke("1") 

 class Data(val value: Int) { companion object { const val DEFAULT =-1 // v--- factory method operator fun invoke(value: String): Data = Data(value.toInt()) // v--- overloading invoke operator operator fun invoke(): Data = Data(DEFAULT) } }