Scala 对参数化抽象类型和协方差感到困惑

Scala 对参数化抽象类型和协方差感到困惑,scala,covariance,parametric-polymorphism,Scala,Covariance,Parametric Polymorphism,考虑以下欺骗服务,它通过类型系统保证请求产生正确类型的响应: import com.twitter.finagle.Service import com.twitter.util.Future import scala.language.higherKinds sealed abstract class Request[+T] { type Response[X] } case class Enqueue[+T](value: T) extends Request[T] { case

考虑以下欺骗服务,它通过类型系统保证请求产生正确类型的响应:

import com.twitter.finagle.Service
import com.twitter.util.Future
import scala.language.higherKinds

sealed abstract class Request[+T] {
  type Response[X]
}

case class Enqueue[+T](value: T) extends Request[T] {
  case object OK
  override type Response[X] = OK.type
}

case object Dequeue extends Request[Nothing] {
  case class Value[+T](value: T)
  override type Response[X] = Value[X]
}

class Queue[T] extends Service[Request[T], Request[T]#Response[T]] {
  override def apply(request: Request[T]): Future[request.Response[T]] = ???
}
如果我能在最后三行中只说
Request[T]#Response
Request.Response
而不是
Request[T]#Response[T]
Request.Response[T]
,那就太好了

我的尝试是增加更多的间接性:

sealed abstract class Request[+T] {
  protected type response[+X]
  final type Response = response[T]
}
但这导致协变类型
T
出现在不变位置


有可能做到这一点吗?

在一般情况下,请求和响应应该具有不同的类型参数。如果希望它们相同,则需要指定两次相同的类型。@n.m.目的是
request.Response
的type参数,其中
request:request[T]
始终是
T
。这是您的代码吗?如果你想让两个论点总是相同的,为什么一开始就有两个论点?你能用通俗易懂的语言解释一下这个设计吗?@n.m.因为否则就不可能覆盖
Dequeue
中的
Response
,因为
Value
的类型参数是未知的。不清楚你想实现什么。它看起来像是由
请求[In,Out]
提供服务,里面没有任何参数化类型。然后
Enqueue[T]扩展请求[T,Nothing]
Dequeue[T]扩展请求[Nothing,T]