次のようなObservable
の配列からを作成したかったのです。Observable
package rxtest
import concurrent._
import concurrent.ExecutionContext.Implicits.global
import rx.lang.scala._
import rx.lang.scala.JavaConversions._
import rx.lang.scala.schedulers._
object A extends App {
val ps = Array.fill(3)(Promise[Int]())
val os = ps map {
p => Observable from p.future observeOn NewThreadScheduler()
}
val v = rx.Observable.merge(os map toJavaObservable)
}
Observable
このプログラムは、いくつかのオーバーロードされたメソッドがすべて呼び出されているため、コンパイルされませんmerge
。
[error] /home/xgp/work/rxtest/src/main/scala/rxtest/A.scala:15: overloaded method value merge with alternatives:
[error] [T](x$1: Array[rx.Observable[_ <: T]])rx.Observable[T] <and>
[error] [T](x$1: rx.Observable[_ <: rx.Observable[_ <: T]])rx.Observable[T] <and>
[error] [T](x$1: Iterable[_ <: rx.Observable[_ <: T]])rx.Observable[T]
[error] cannot be applied to (Array[rx.Observable[_ <: Int]])
[error] val v = rx.Observable.merge(os map toJavaObservable)
[error] ^
[error] one error found
次に、別の Java クラスを使用してオーバーロードを削除したいと考えました。
public class RxUtils {
public final static <T> Observable<T> merge(Observable<? extends T>[] os) {
return Observable.merge(os);
}
}
Scala コードは次のようになりました (関連する部分のみをここに示します)。
val ps = Array.fill(3)(Promise[Int]())
val os = ps map {
p => Observable from p.future observeOn NewThreadScheduler()
}
val v = RxUtils.merge(os map toJavaObservable)
このプログラムはまだコンパイルされません:
[error] /home/xgp/work/rxtest/src/main/scala/rxtest/A.scala:17: no type parameters for method merge: (os: Array[rx.Observable[_ <: T]])rx.Observable[T] exist so that it can be applied to arguments (Array[rx.Observable[_ <: Int]])
[error] --- because ---
[error] argument expression's type is not compatible with formal parameter type;
[error] found : Array[rx.Observable[_ <: Int]]
[error] required: Array[rx.Observable[_ <: ?T]]
[error] val v = RxUtils.merge(os map toJavaObservable)
[error] ^
[error] /home/xgp/work/rxtest/src/main/scala/rxtest/A.scala:17: type mismatch;
[error] found : Array[rx.Observable[_ <: Int]]
[error] required: Array[rx.Observable[_ <: T]]
[error] val v = RxUtils.merge(os map toJavaObservable)
[error] ^
[error] two errors found
3 つの質問があります。
merge
最初のケースのように純粋な Scala でメソッドを呼び出す方法は?- 2 番目のプログラムがコンパイルされないのはなぜですか?
- Scala
merge
で上記のクラスのメソッドを呼び出す方法は?RxUtils