我有一個特點:Scala類型:如何限制子類的泛型類型?
trait OAuthService {
def sendWithAuthorizationQueryParams[A](request: OAuthRequest)(implicit unmarshaller: Unmarshaller[ResponseEntity, A]): Future[A] = {
val httpRequest = request.toHttpRequestWithAuthorizationQueryParams
sendAndReceive(httpRequest, request.signature)
}
def sendWithAuthorizationHeader[A](request: OAuthRequest)(implicit unmarshaller: Unmarshaller[ResponseEntity, A]): Future[A] = {
val httpRequest = request.toHttpRequestWithAuthorizationHeader
sendAndReceive(httpRequest, request.signature)
}
protected def sendAndReceive[A](httpRequest: HttpRequest, id: String)(implicit unmarshaller: Unmarshaller[ResponseEntity, A]): Future[A]
}
我創建一個子類:
class StreamingOAuthService()(implicit val actorPlumbing: ActorPlumbing) extends OAuthService {
private val log = LoggerFactory.getLogger(getClass())
override protected def sendAndReceive[A](httpRequest: HttpRequest, id: String)(implicit unmarshaller: Unmarshaller[ResponseEntity, A]) = {
log.debug(s"Http request: {}.", httpRequest)
import actorPlumbing._
val host = httpRequest.uri.authority.host.address()
val connectionFlow: Flow[HttpRequest, HttpResponse, Future[OutgoingConnection]] = Http().outgoingConnectionTls(host)
Source.single(httpRequest)
.via(connectionFlow)
.runWith(Sink.head)
}
}
在StreamingOAuthService
,我想凍結泛型類型爲ResponseEntity
。換句話說,我想指定StreamingOAuthService
方法支持的唯一類型是ResponseEntity
。如圖所示,StreamingOAuthService.sendAndReceive
不會編譯,因爲返回類型是Future[ResponseEntity]
,而不是由性狀指定的Future[A]
。
仍然不滿意 - 我有第二個答案看起來更有希望,涉及類型操作符。 – Shadowlands