Kotlin lambda语法混淆
我被Kotlin lambda语法弄糊涂了。
起初,我有
.subscribe( { println(it) } , { println(it.message) } , { println("completed") } )
这工作正常 。
然后,我将onNext移动到另一个名为GroupRecyclerViewAdapter的类,该类实现了Action1<ArrayList<Group>>
。
.subscribe( view.adapter as GroupRecyclerViewAdapter , { println(it.message) } , { println("completed") } )
但是,我得到了错误:
Error:(42, 17) Type mismatch: inferred type is () -> ??? but rx.functions.Action1<kotlin.Throwable!>! was expected Error:(42, 27) Unresolved reference: it Error:(43, 17) Type mismatch: inferred type is () -> kotlin.Unit but rx.functions.Action0! was expected
我可以修改为:
.subscribe( view.adapter as GroupRecyclerViewAdapter , Action1<kotlin.Throwable> { println(it.message) } , Action0 { println("completed") } )
有没有办法写lambda没有指定类型? ( Action1<kotlin.Throwable>
, Action0
)
注意:订阅是RxJava方法
编辑1
class GroupRecyclerViewAdapter(private val groups: MutableList<Group>, private val listener: OnListFragmentInteractionListener?) : RecyclerView.Adapter<GroupRecyclerViewAdapter.ViewHolder>(), Action1<ArrayList<Group>> {
view.adapter as GroupRecyclerViewAdapter
部分应该是lambda func,而不是Action,因为onError和onComplete也lambdas
所以,要解决这个问题:
.subscribe( { (view.adapter as GroupRecyclerViewAdapter).call(it) } , { println(it.message) } , { println("completed") } )
与你的名字(用你的类型替换Unit
)
class GroupRecyclerViewAdapter : Action1<Unit> { override fun call(t: Unit?) { print ("onNext") } }
与lambdas
val ga = GroupRecyclerViewAdapter() ...subscribe( { result -> ga.call(result) }, { error -> print ("error $error") }, { print ("completed") })
与行动
...subscribe( ga, Action1{ error -> print ("error $error") }, Action0{ print ("completed") })
选一个
您有两种版本的subscribe
方法可供选择:
- 第一个(真实的)具有签名
subscribe(Action1<ArrayList<Group>>, Action1<Throwable>, Action0)
。 - 第二个版本由Kotlin编译器生成,并具有签名
subscribe((ArrayList<Group>>) -> Unit, (Throwable) -> Unit, () -> Unit)
但是,在您的代码中,您传递了以下参数类型:
subscribe( view.adapter as GroupRecyclerViewAdapter, // Action1<Throwable> { println(it.message) }, // (Throwable) -> Unit { println("completed") } // () -> Unit )
正如你所看到的,这些参数类型不满足任何可用的签名。 另一个答案给你一些解决你的问题。 另外,可以使GroupRecyclerViewAdapter
实现功能类型Function1<ArrayList<Group>, Unit>
(它们也是接口),而不是Action1<ArrayList<Group>>
。