自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
版本吗?
答案 0 :(得分:2)
Kotlin函数参考表达式与java方法参考表达式不同。返回类型Any
与返回类型Unit
不兼容。
错误来自MutableList#add(Int)
方法的返回类型( Boolean )与参数参数类型 (Int)->Unit
不兼容subscribe
方法。
所以你只能这样使用lambda表达式。
当参数类型和返回类型都与函数兼容时,您可以在某处使用list::add
。例如:
val add1:(Int) -> Boolean = list::add; // MutableList.add(Int);
val add2:(Int,Int) -> Unit = list::add; // MutableList.add(Int,Int);
答案 1 :(得分:2)
重新说明并详细说明另一个答案:问题是需要Consumer
,它接受一个元素并在其单个方法中不返回任何内容。 Kotlin中相应的函数类型为(T) -> Unit
。
MutableList
接口中描述的add
方法的类型为(T) -> Boolean
:如果元素已成功添加,则返回true(这是为了支持可以&#的接口实现) 39; t包含重复项。)
对此可能的解决方案是添加一个扩展方法,该方法将元素添加到MutableList
而不返回任何内容:
fun <T> MutableList<T>.addItem(element: T): Unit {
this.add(element)
}
然后,您可以使用对此扩展名的绑定可调用引用,就像其他MutableList
方法一样:
Flux.just(1, 2, 3, 4)
.log()
.subscribe(elements::addItem)