2017-06-15 10 views
2

次のコードは、RxJavaの例をKotlinに変換しようとしています。 MutableListIntの束を集めることになっていますが、いくつかのエラーが発生します。RxKotlin collectInto()メソッドリファレンスを使用するMutableList

val all: Single<MutableList<Int>> = Observable 
     .range(10, 20) 
     .collectInto(::MutableList, MutableList::add) 

エラー:

Error:(113, 36) Kotlin: Type inference failed: Not enough information to infer parameter T in inline fun <T> MutableList(size: Int, init: (index: Int) -> T): MutableList<T> 
Please specify it explicitly. 

Error:(113, 49) Kotlin: One type argument expected for interface MutableList<E> : List<E>, MutableCollection<E> defined in kotlin.collections 

    Error:(113, 67) Kotlin: None of the following functions can be called with the arguments supplied: 
public abstract fun add(element: Int): Boolean defined in kotlin.collections.MutableList 
public abstract fun add(index: Int, element: Int): Unit defined in kotlin.collections.MutableList 

ImmutableList::addImmutableList<Int>::addに、私が交換され、エラーが期待type引数、取り除く私が変更した場合:これはストレートで

Error:(113, 22) Kotlin: Type inference failed: fun <U : Any!> collectInto(initialValue: U!, collector: ((U!, Int!) -> Unit)!): Single<U!>! 
     cannot be applied to 
     (<unknown>,<unknown>) 

Javaの次のコピー:

最初のエラーは間違ったタイプを推測していることを示していますが、私はより明示的に(どこで?)必要があることを理解していますが、::MutableList() -> MutableList<Int>と同等と考えていました。 3つ目のエラーは、引数を使ってadd()メソッドのいずれも呼び出せないことを伝えていますが、やはりMutableList::add{ list, value -> list.add(value) }に相当します。 4番目のエラーは、collectorに適用されているタイプがわからないことを示しています。

私が代わりにラムダ式を使用する場合は、エラーがない:

val all: Single<MutableList<Int>> = Observable 
     .range(10, 20) 
     .collectInto(mutableListOf(), { list, value -> list.add(value) }) 

all.subscribe { x -> println(x) } 

私が誤解してきた何かが明確にありますように私は、私はメソッド参照と間違ってやってるかについていくつかのコメントをいただければと思います(Kotlin Language Referenceを見て、私はそれがこの時点で言語機能であるのだろうかと思っています)。とても有難い。

+0

あなたはlambdasで同じエラーを受け取っていませんか?私はそれを得るので... – Lovis

答えて

2

最初の例では、collectIntoのメソッドシグニチャにcollectのメソッドシグネチャを適用しようとしています。 collect以来

これは働くことはできませんが、Func0<R>Action2<R, ? super T>を期待してcollectInto実際のオブジェクトBiConsumer<U, T>期待しています。
コンストラクタ参照collectIntoのために働くことができない - あなたは本当のオブジェクト(例えば、あなたのmutableListOf()コール)が必要

第二の問題は、KotlinはBiConsumerオブジェクトではなく機能を期待されていることです。なぜ私はそれほど確かではありません。どうやら、KotlinはSAM-Interfacesからラムダと関数リファレンスのために複数のジェネリックスを扱うことはできません。

したがって、関数だけでなく、BiConsumerのインスタンスを渡す必要があります。

range(10, 20).collectInto(mutableListOf(), BiConsumer { l, i -> l.add(i) }) 

はありませんが

range(10, 20).collectInto(mutableListOf(), { l, i -> l.add(i) }) 

は、私にエラーを与える:私はあなたがエラーメッセージについて確認しているかどうかをコメントで尋ねた理由もあります

+0

説明をありがとう。少し読んで、私は同じような結論に達しました。私は間違いがない。どのバージョンのKotlinを使用していますか?私は1.1.2-5を持っています。 – amb85

+1

[こちらはこちら](https://github.com/AshleyByeUK/rxkotlin/blob/6f9bb30c7b1da970c6edb4b11527c29208609056/src/main/kotlin/uk/ashleybye/rxkotlin/operatorstransformations/AdvancedOperators.kt#L107-L130)この例を完全に実装しました。 – amb85

+0

@ amb85私も1.1.2-5¯\ _(ツ)_ /¯を使用している – Lovis

関連する問題