Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 泛型流和抽象数据类型_Scala_Akka Stream_Akka Http - Fatal编程技术网

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]
)