参数化的抽象类型和协方差令人困惑

时间:2015-03-09 15:18:14

标签: scala covariance parametric-polymorphism

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

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]#Responserequest.Response而不是Request[T]#Response[T]request.Response[T],那就太好了。

我的尝试是添加更多间接:

sealed abstract class Request[+T] {
  protected type response[+X]
  final type Response = response[T]
}

但这导致协变型T出现在不变位置。

是否可以这样做?

0 个答案:

没有答案