ReactiveMongo Sort方法参数类型不匹配问题(版本升级后)
解决ReactiveMongo 0.19.2 + Scala 2.12中find方法sort参数的编译错误
我来帮你理清这个问题的来龙去脉,以及对应的解决办法:
问题到底出在哪?
在ReactiveMongo 0.16.0 + Scala 2.11的组合里,编译器还能顺利推断出sorter.getOrElse(reactivemongo.bson.BSONDocument())的类型是BSONDocument,但升级到Scala 2.12之后,Scala的类型推断规则做了细微调整,再加上ReactiveMongo 0.19.x对API的类型约束变得更严格,就出问题了。
当你直接把sorter.getOrElse(...)作为参数传给sort()时,编译器没办法准确识别这个表达式的具体类型,会把它当成最宽泛的Object类型,而sort()明确要求传入BSONDocument,自然就报类型不匹配的错误了。
但如果你先把这个值赋值给一个变量(比如你代码里的_sorter),编译器会先确定这个变量的类型是BSONDocument,再把它传给sort()就完全符合要求了。
几种可行的解决方式
除了你现在用的“先赋值给变量”的方法,还有两种更简洁的思路:
1. 显式指定表达式的类型
直接在getOrElse的结果后面加上类型注解,帮编译器明确类型:
import reactivemongo.bson.BSONDocument def _find[T](selector: Option[BSONDocument], sorter: Option[BSONDocument], projection: Option[BSONDocument]) (implicit reader: BSONDocumentReader[T], collectionName: String): Future[List[T]] = { for { collection <- database.map(_.collection(collectionName)) r <- collection.find(selector.getOrElse(BSONDocument())) // 显式指定类型,让编译器知道这是BSONDocument .sort(sorter.getOrElse(BSONDocument()): BSONDocument) .projection(projection.getOrElse(BSONDocument())) .cursor[T]().collect[List](Int.MaxValue, Cursor.FailOnError[List[T]]()) } yield r }
2. 提前定义默认值常量
把默认的空BSONDocument定义成一个常量,既减少重复代码,也能让编译器明确类型:
import reactivemongo.bson.BSONDocument def _find[T](selector: Option[BSONDocument], sorter: Option[BSONDocument], projection: Option[BSONDocument]) (implicit reader: BSONDocumentReader[T], collectionName: String): Future[List[T]] = { // 提前定义默认的各类空文档 val defaultFilter = BSONDocument() val defaultSort = BSONDocument() val defaultProjection = BSONDocument() for { collection <- database.map(_.collection(collectionName)) r <- collection.find(selector.getOrElse(defaultFilter)) .sort(sorter.getOrElse(defaultSort)) .projection(projection.getOrElse(defaultProjection)) .cursor[T]().collect[List](Int.MaxValue, Cursor.FailOnError[List[T]]()) } yield r }
小提示
Scala 2.12的类型推断在处理嵌套表达式时,有时候需要一点“提示”,尤其是使用第三方库API的时候。以后再遇到类似的类型不匹配问题,要么给表达式加类型注解,要么把复杂表达式拆成变量,这俩办法基本都能解决问题。
内容的提问来源于stack exchange,提问作者Joseph Hui
相关产品推荐
相关产品推荐

