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