You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch中DeleteResponse与DeleteByQueryResponse匹配生效原因问询

问题原因

这是JVM平台的泛型类型擦除机制导致的必然现象:

  • JVM在编译阶段会抹除所有泛型的参数类型信息,你代码中RequestSuccess[DeleteResponse]和RequestSuccess[DeleteByQueryResponse]两种类型,编译后在运行时的实际类型都是RequestSuccess,泛型参数信息完全不可见。
  • 模式匹配运行时只校验实例的类是否匹配,不会校验泛型参数是否符合,所以只要delete方法返回的是成功状态的RequestSuccess实例,不管你把泛型参数改成任何类型,这个case分支都会命中。
  • 正常情况下你修改代码后编译器会给出对应警告,提示你type argument XXX is unchecked since it is eliminated by erasure,就是告知你这个泛型参数的匹配规则不会生效。

解决方案

如果需要严格匹配响应类型,建议在匹配分支上加守卫判断实际返回体的类型,示例如下:

ElasticService.delete(id) match {
  case failure: RequestFailure => 
    complete(StatusCodes.InternalServerError, failure.body.getOrElse("Unknown reason"))
  case success: RequestSuccess[_] if success.body.isInstanceOf[DeleteResponse] => 
    println(s"$id Deleted")
    // 后续逻辑
}

内容的提问来源于stack exchange,提问作者Mandroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:15:04