13

我对 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)

注意:subscribe 是 RxJava 方法

编辑 1

class GroupRecyclerViewAdapter(private val groups: MutableList<Group>,
                           private val listener: OnListFragmentInteractionListener?) :
RecyclerView.Adapter<GroupRecyclerViewAdapter.ViewHolder>(), Action1<ArrayList<Group>> {
4

2 回答 2

12

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")
    }
}

使用 lambda

val ga = GroupRecyclerViewAdapter()
...subscribe(
    { result -> ga.call(result) },
    { error -> print ("error $error") },
    { print ("completed") })

用行动

...subscribe(
    ga,
    Action1{ error -> print ("error $error") },
    Action0{ print ("completed") })

选一个

于 2016-01-24T02:06:04.613 回答
2

您有两个版本的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>>.

于 2016-01-25T12:34:51.073 回答