限制的可调用的引用不与反应堆订阅
从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)