Как программа Scala компилируется, учитывая, что метод bindAndHandle принимает первый параметр типа Flow, а не Route? - PullRequest
0 голосов
/ 11 февраля 2020

В демонстрационном проекте, https://github.com/chbatey/akka-http-typed существует следующий код, который компилируется, но я не могу понять, как получается, что выражение "Http () (untypedSystem) .bindAndHandle (rout.userRoutes, "localhost", 8080) "можно скомпилировать, учитывая, что метод bindAndHandle принимает указанные ниже параметры (поэтому первым должен быть Flow, но это Route, т.е. тип RequestContext ⇒ тип функции Future [RouteResult]).

В другом проекте я получаю ошибку компиляции, которую я могу понять, потому что фактический параметр имеет тип Route, но объявленный тип первого аргумента, если Flow.

Пожалуйста, совет.

//def bindAndHandle(
//    handler:   Flow[HttpRequest, HttpResponse, Any],
//    interface: String, port: Int = DefaultPortForProtocol,
//    connectionContext: ConnectionContext = defaultServerHttpContext,
val serverBinding: Future[Http.ServerBinding] = Http()(untypedSystem).bindAndHandle(routes.userRoutes, "localhost", 8080)
//type of routes.userRoutes is Route
//where type Route = RequestContext ⇒ Future[RouteResult]
//how can it be that this compiles? In another project it does not (which makes more sense to me)

1 Ответ

4 голосов
/ 11 февраля 2020

Существует неявное преобразование из Route в Flow[HttpRequest, HttpResponse, NotUsed] в сопутствующем объекте типа RouteResult, называемом route2HandlerFlow.

Неясно, почему это не найдено в вашем другой проект, но опубликуйте это как отдельный вопрос, если это продолжает оставаться проблемой.

...