限制的可调用的引用不与反应堆订阅

从1.1开始,Kotlin已经绑定了可调用的引用 。 正如我在1.1.3,我想我应该能够使用以下访问add方法:

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

但是,这会引发一个错误:

元素::添加错误

我不确定这个错误在这个特定情况下意味着什么。 我可以使用.subscribe({ elements.add(it) })没有问题,但我不应该能够使用elements::add版本?

Kotlin函数参考表达式不像java方法参考表达式那样。 返回类型Any与返回类型Unit不兼容。

错误来自MutableList#add(Int)方法的返回类型( Boolean )与MutableList#add(Int)方法的参数参数类型(Int)->Unit不兼容。 所以你只能用这种方式来使用lambda表达式。

当参数类型和返回类型与函数兼容时, list::add在某处使用list::add 。 例如:

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

要对其他答案进行改写和阐述:问题在于Consumer是期望的, Consumer需要一个元素并且在其单一方法中没有返回任何东西。 这个在Kotlin中相应的函数类型是(T) -> Unit

然而, MutableList接口中描述的add方法的类型是(T) -> Boolean :如果元素被成功添加(这是为了支持不能包含重复的接口的实现),则返回true。

对此可能的解决方案是添加一个扩展方法,该方法将一个元素添加到MutableList而不返回任何内容:

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

然后,您可以像使用其他MutableList方法一样,对此扩展使用绑定的可调用引用:

 Flux.just(1, 2, 3, 4) .log() .subscribe(elements::addItem)