2017-07-10 9 views
0

は、私がジェネリックストリームと抽象データ型のここ

trait RequestBuilder { 
    type Out 

    def complete(p: Promise[Out]): Unit 
} 

def makeRequest(in: RequestBuilder): Source[(RequestBuilder, Promise[in.Out]), Future[in.Out]] = { 
    val p = Promise[in.Out] 

    Source.single(in -> p).mapMaterializedValue(_ => p.future) 
} 

val sink = MergeHub.source[(RequestBuilder, Promise[???])].to(Sink.foreach { 
    case (r, p) => r.complete(p) 
}).run() 

sink.runWith(makeRequest(new RequestBuilder { 
    type Out = Int 

    def complete(p: Promise[Out]): Unit = p.success(1) 
})) 

問題があるのが午前問題を示してstrawmanプログラムは、どのように私は、シンクでPromise[???]を入力しないのですか?あなたはタプルに対してタイプエイリアスを作ることができ

答えて

0

私は約束RequestBuilderトレイト自身の一部することによってこの問題を回避することができたが、これは私にはコードのにおいのように思える:

type BuilderWithPromise[B <: RequestBuilder] = (B, Promise[B#Out]) 

またはケースクラス:あなたはまだ型パラメータを持っているとして、いずれかの方法は、

+0

これは実際には動作しません動作するはずです

case class BuilderWithPromise[B <: RequestBuilder)( builder: B, promise: Promise[B#Out] ) 

。あなたがそれを提供しなければ、それは 'Nothing'として推論されます。 'Sink'は共変ではないので、何かを結ぶことができなくなります。 – Jeff

+0

何を言っているのか分かりません。あなたは自分のコードとエラーを表示できますか? – Dima

+0

上記にはいくつかの問題があります。 1つは、タイププロジェクションを使用していることです。これは、パスに依存するタイプが必要なため、この場合は機能しません。もう1つは、型エイリアスとケースクラスの両方がコンパイル時に知る必要のあるパラメトリック型を持っていることです。 – Jeff

関連する問題