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>>