13

Kotlin ラムダ構文に混乱しています。

最初に、私は持っています

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

型を指定せずにラムダを書く方法はありますか? ( 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 GroupRecyclerViewAdapteronError と onComplete もラムダであるため、部分は Action ではなく lambda func にする必要があります。

したがって、これを修正するには、次のことを試してください。

.subscribe(
          { (view.adapter as GroupRecyclerViewAdapter).call(it) }
          , { println(it.message) }
          , { println("completed") }
      )

あなたの名前で(あなたのタイプに置き換えUnitてください)

class GroupRecyclerViewAdapter : Action1<Unit> {
    override fun call(t: Unit?) {
        print ("onNext")
    }
}

ラムダで

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

次の 2 つのバージョンのsubscribe方法から選択できます。

  • 最初の (本物の) には署名があります subscribe(Action1<ArrayList<Group>>, Action1<Throwable>, Action0)
  • 2 番目のバージョンは Kotlin コンパイラによって生成され、署名があります。subscribe((ArrayList<Group>>) -> Unit, (Throwable) -> Unit, () -> Unit)

ただし、コードでは、次のパラメーター タイプを渡します。

subscribe(
    view.adapter as GroupRecyclerViewAdapter, // Action1<Throwable>
    { println(it.message) },  // (Throwable) -> Unit
    { println("completed") } // () -> Unit
)

ご覧のとおり、これらのパラメーターの型は、使用可能な署名のいずれも満たしていません。もう1つの答えは、問題に対するいくつかの解決策を提供します。さらに、の代わりにGroupRecyclerViewAdapter機能型を実装することもできFunction1<ArrayList<Group>, Unit>ます (それらもインターフェイスです) Action1<ArrayList<Group>>

于 2016-01-25T12:34:51.073 に答える