Rob*_*ley 5 scala scala-java-interop elasticsearch-2.4
特别是"org.elasticsearch" % "elasticsearch" % "2.4.x"(它确实适用于ActionRequest不再采用参数类型的ElasticSearch的更高版本,但我们无法更新到那些!).
我们试图覆盖的Java方法定义如下(source):
protected <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) {
in().execute(action, request, listener);
}
Run Code Online (Sandbox Code Playgroud)
天真的企图覆盖它......
import org.elasticsearch.action._
import org.elasticsearch.client.{Client, FilterClient}
class DemoFilterClient(underlyingClient: Client) extends FilterClient(underlyingClient) {
override def doExecute[
Request <: ActionRequest[_],
Response <: ActionResponse,
RequestBuilder <: ActionRequestBuilder[Request, Response, RequestBuilder]
](
action: Action[Request, Response, RequestBuilder],
request: Request,
listener: ActionListener[Response]
) = super.doExecute(action, request, listener)
}
Run Code Online (Sandbox Code Playgroud)
... 在我们尝试的所有Scala版本中都失败了(2.11.11,2.11.12和2.12.4):
[info] Compiling 1 Scala source to /home/roberto/development/elasticsearch-scala-client-test/target/scala-2.11/classes ...
[error] /home/roberto/development/elasticsearch-scala-client-test/src/main/scala/com/gu/DemoFilterClient.scala:7:101: type arguments [Request,Response,RequestBuilder] do not conform to class ActionRequestBuilder's type parameter bounds [Request <: org.elasticsearch.action.ActionRequest[_ <: org.elasticsearch.action.ActionRequest[_ <: org.elasticsearch.action.ActionRequest[_ <: AnyRef]]],Response <: org.elasticsearch.action.ActionResponse,RequestBuilder <: org.elasticsearch.action.ActionRequestBuilder[Request,Response,RequestBuilder]]
[error] override def doExecute[Request <: ActionRequest[_], Response <: ActionResponse, RequestBuilder <: ActionRequestBuilder[Request, Response, RequestBuilder]](action: Action[Request, Response, RequestBuilder], request: Request, listener: ActionListener[Response]) = super.doExecute(action, request, listener)
[error] ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)
更清楚地列出编译器错误:
type arguments
[Request,Response,RequestBuilder]
do not conform to class ActionRequestBuilder's type parameter bounds
[
Request <:
org.elasticsearch.action.ActionRequest[_ <:
org.elasticsearch.action.ActionRequest[_ <:
org.elasticsearch.action.ActionRequest[_ <: AnyRef]]],
Response <: org.elasticsearch.action.ActionResponse,
RequestBuilder <: org.elasticsearch.action.ActionRequestBuilder[Request,Response,RequestBuilder]
]
Run Code Online (Sandbox Code Playgroud)
注意Request类型的惊人递归声明!
示例sbt项目可从https://github.com/guardian/elasticsearch-scala-client-test获得
我遇到过你之前有这种F-bounded多态与原始Java类型的情况,如果我没记错的话,这样的东西应该可行(至少它在你的示例项目中编译):
package com.gu
import org.elasticsearch.action._
import org.elasticsearch.client.{Client, FilterClient}
class DemoFilterClient(underlyingClient: Client)
extends FilterClient(underlyingClient) {
type AR[x <: ActionRequest[x]] = ActionRequest[x]
override def doExecute[
Request <: AR[_],
Response <: ActionResponse,
RequestBuilder <: ActionRequestBuilder[Request, Response, RequestBuilder]
](
action: Action[Request, Response, RequestBuilder],
request: Request,
listener: ActionListener[Response]
) = super.doExecute(action, request, listener)
}
Run Code Online (Sandbox Code Playgroud)
看起来它也应该可以用a内联实现forSome,但是我刚才尝试过的迭代都没有.
| 归档时间: |
|
| 查看次数: |
239 次 |
| 最近记录: |