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

Другие вопросы по тегам