Scala 泛型流和抽象数据类型
下面是一个斯特劳曼计划,它说明了我面临的问题Scala 泛型流和抽象数据类型,scala,akka-stream,akka-http,Scala,Akka Stream,Akka Http,下面是一个斯特劳曼计划,它说明了我面临的问题 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 ->
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)
}))
问题是,如何在水槽中键入
Promise[???]
?我已经能够通过将承诺作为RequestBuilder特性本身的一部分来解决这一问题,但对我来说这似乎是一种代码味道您可以为元组创建一个类型别名:
type BuilderWithPromise[B <: RequestBuilder] = (B, Promise[B#Out])
类型BuilderWithPromise[B这实际上不起作用,因为您仍然有一个类型参数。如果您不提供它,它将被推断为Nothing
。因为Sink
是不协变的,这将阻止您将任何内容连接起来。不确定您在说什么。您能显示您的代码吗,以及您得到的错误吗?上面有许多问题。一个是它使用的是类型投影,在本例中不起作用,因为我需要依赖路径的类型。另一个原因是类型别名和case类仍然有一个参数化类型,需要在编译时知道。例如,这不会编译,因为您没有为B
trait RequestBuilder提供类型{type Out def complete(p:Promise[Out]):Unit}type BuilderWithPromise[B}
case class BuilderWithPromise[B <: RequestBuilder)(
builder: B,
promise: Promise[B#Out]
)