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
相关产品推荐
相关产品推荐

