1

我试图通过围绕它编写一个包装器来使用 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 能够完全推断ReqResp从中推断,然后正确调用其余部分。

但是,这失败了:

error: missing parameter type for expanded function ((x$4) => client.newEventCall.call(x$4))

显然我可以通过以下方式手动提供类型:

serviceCall(myAuth, client.newEventCall.call(_:EventRequest)) { ... }

但我想避免这种情况。有任何想法吗?

如果这可以进一步简化,也可以加分。

4

0 回答 0