考虑以下 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]#Response
andrequest.Response
而不是Request[T]#Response[T]
and就好了。request.Response[T]
我的尝试是增加更多的间接性:
sealed abstract class Request[+T] {
protected type response[+X]
final type Response = response[T]
}
但这导致协变类型T
出现在不变的位置。
有可能做到这一点吗?