La reference obligatoria enlazada no funciona con Reactor Subscribe

Desde 1.1, Kotlin ha tenido references obligatorias bindings . Como estoy en 1.1.3, creo que debería poder usar lo siguiente para acceder al método add :

 val elements = mutableListOf<Int>() Flux.just(1, 2, 3, 4) .log() .subscribe(elements::add) 

Sin embargo, esto arroja un error:

elementos :: agregar error

No estoy seguro de lo que significa ese error en esta instancia específica. Puedo usar .subscribe({ elements.add(it) }) sin problemas, pero ¿no debería poder usar los elements::add versión?

La expresión de reference de la function Kotlin no es como la expresión de reference del método java. el tipo de devolución Any no es compatible con el tipo de devolución Unit .

el error proviene del tipo de retorno ( boolean ) del MutableList#add(Int) no es compatible con el parámetro tipo de parámetro (Int)->Unit del método de subscribe . entonces solo puedes usar la expresión lambda de esta manera.

puede usar list::add in somewhere cuando los types de parameters y el tipo de retorno son compatibles con la function. por ejemplo:

 val add1:(Int) -> Boolean = list::add; // MutableList.add(Int); val add2:(Int,Int) -> Unit = list::add; // MutableList.add(Int,Int); 

Para reformular y elaborar en la otra respuesta: el problema es que se espera un Consumer , que toma un elemento y no devuelve nada en su único método. El tipo de function correspondiente para esto en Kotlin sería (T) -> Unit .

Sin embargo, el método add descrito en la interfaz MutableList tiene el tipo (T) -> Boolean : devuelve verdadero si el elemento se agregó con éxito (esto es para admitir implementaciones de la interfaz que no pueden contener duplicates).

Una posible solución a esto es agregar un método de extensión que agrega un elemento a una MutableList sin devolver nada:

 fun <T> MutableList<T>.addItem(element: T): Unit { this.add(element) } 

A continuación, puede usar una reference obligatoria obligatoria a esta extensión, al igual que otros methods MutableList :

 Flux.just(1, 2, 3, 4) .log() .subscribe(elements::addItem) 
  • Realm Nested Object sort
  • ¿Cuál es la diferencia entre var name: String? y var nombre: Cadena
  • Kotlin - Continuar con la Corutina después de la Excepción
  • ¿Cómo escribir un inicializador estático a nivel de package en Kotlin?
  • Texto parpadeando en Android, con Kotlin más conciso
  • Clase abstracta Kotlin java IllegalAccessError
  • ¿Kotlin es 100% compatible con ART en Android?
  • ¿Dónde deberían savese los files de estado?
  • Función de extensión Kotlin: reference no resuelta
  • Getpreferences no funciona en fragment
  • Implementación onItemClickLitsner en recyclerView Kotlin -android