我试图通过围绕它编写一个包装器来使用 Scala 中的外部 Java 服务 API。每个 API 调用都有一个 Request 类和 Response 类,以及一个在底层 java 客户端中设置调用的工厂方法,即
val caller = serviceClient.newDoSomething()
val request = DoSomethingRequest(...)
val response = caller.call(request)
其中 response 的类型为DoSomethingResponse
。
这种模式重复了一堆不同的操作,只是在请求/响应类和工厂方法的名称上有所不同。我想干掉代码并使用类型推断,同时注意到 java 方法的关键观察
caller.call
是类型Request => Response
。
鉴于我尝试了以下操作:
class ServiceAPI {
val client = Service.getDefaultClient
def serviceCall[Req, Resp](auth: String, caller: Req => Resp)
(func: Req => Unit)(implicit m:Manifest[Req]):Resp = {
val request = m.erasure.newInstance.asInstanceOf[Req]
request.setAuth(auth)
func(request)
caller(request)
}
}
我最终想要的是一个可消耗的 scala API,可以像这样调用:
serviceCall(myAuth, client.newEventCall.call(_)) {
_.setFoo("foo") // On request
_.setBar(2) // On request
}
我希望通过提供部分函数client.newEventCall.call(_)
Scala 能够完全推断Req
并Resp
从中推断,然后正确调用其余部分。
但是,这失败了:
error: missing parameter type for expanded function ((x$4) => client.newEventCall.call(x$4))
显然我可以通过以下方式手动提供类型:
serviceCall(myAuth, client.newEventCall.call(_:EventRequest)) { ... }
但我想避免这种情况。有任何想法吗?
如果这可以进一步简化,也可以加分。