如何在Scala中覆盖`org.elasticsearch.client.FilterClient #doE
发布时间:2020-12-16 18:09:52 所属栏目:安全 来源:网络整理
导读:特别是使用“org.elasticsearch”%“elasticsearch”%“2.4.x”(它与更高版本一起使用 work) ElasticSearch,其中ActionRequest不再采用参数类型,但我们无法更新到那些!). 我们试图覆盖的Java方法定义如下(source): protected Request extends ActionRequ
特别是使用“org.elasticsearch”%“elasticsearch”%“2.4.x”(它与更高版本一起使用
work)
ElasticSearch,其中ActionRequest不再采用参数类型,但我们无法更新到那些!). 我们试图覆盖的Java方法定义如下(source): protected <Request extends ActionRequest,Response extends ActionResponse,RequestBuilder extends ActionRequestBuilder<Request,Response,RequestBuilder>> void doExecute(Action<Request,RequestBuilder> action,Request request,ActionListener<Response> listener) { in().execute(action,request,listener); } 天真的企图覆盖它…… 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,RequestBuilder] ]( action: Action[Request,RequestBuilder],request: Request,listener: ActionListener[Response] ) = super.doExecute(action,listener) } … fails在所有版本的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,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,RequestBuilder]] [error] override def doExecute[Request <: ActionRequest[_],RequestBuilder]](action: Action[Request,listener: ActionListener[Response]) = super.doExecute(action,listener) [error] ^ [error] one error found 更清楚地列出编译器错误: type arguments [Request,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]]],RequestBuilder] ] 请注意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[_],listener) } 似乎也应该可以使用forSome进行内联,但是我刚刚尝试过的迭代都没有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |