Intereting Posts

Котлин: оператор двойной толстой кишки (отражение)

Поэтому я работал с VertX Web, пытаясь заставить его работать с Kotlin. Там есть маршрутизатор, и вы должны сказать что-то вроде

val vertx = Vertx.vertx() val server = vertx.createHttpServer() val router = Router.router(vertx) server.requestHandler(router::accept) 

Но это не сработает. Что я делаю не так? Когда я использую его на определенных классах Kotlin, он ведет себя нормально. Это сделано специально?

Как бы то ни было, мне пришлось делать это вручную, как это

 server.requestHandler{router.accept(it)} 

Это известная ошибка.

См. Эту проблему .

Обходным путем является использование Lambda вместо этого. например

 class Foo { fun doWork(work: () -> Unit) { work() } } class Bar (val text: String) { fun printText() { println("${text}") } } val foo: Foo = Foo() val bar: Bar = Bar("Hello Kotlin!") foo.doWork(bar::printText) //Fails foo.doWork({ bar.printText() }) //Is working 

Технически это не ошибка. Я спросил на раннем этапе, планируют ли они поддерживать ссылки на методы в экземплярах в версии 1, и мне сказали, что они, скорее всего, этого не сделают.

Ссылки на методы могут использоваться только из классов и модулей, а не из экземпляров. Исходя из Java 8, это похоже на большое дело, но, учитывая потенциальную кратность их синтаксиса лямбда, это действительно так.

UPDATE: они планируют добавить эту функцию в 1.1