Kotlin: оператор двойного двоеточия (отражения)
Поэтому я работал с 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)}
2 ответа
Это известная ошибка.
Смотрите эту проблему.
Обходной путь должен использовать лямбду вместо этого. например
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, это кажется большим делом, но, учитывая потенциальную краткость их лямбда-синтаксиса, это действительно не так.
ОБНОВЛЕНИЕ: Они планируют добавить эту функцию в 1.1