加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在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进行内联,但是我刚刚尝试过的迭代都没有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读