对于下面的方法定义,当我显式设置返回类型时List[String],编译器会抱怨,因为它期望(可变)Buffer[String].这是为什么?里面每个可能的情况下flatMap返回List[String].列表 - >缓冲区转换在何处以及为何发生?
private def getHitTerms(q: Query, searcher: IndexSearcher, docId: Int): List[String] = {
val bq = q.asInstanceOf[BooleanQuery]
bq.clauses().asScala.flatMap(c => {
val q = c.getQuery()
if (q.isInstanceOf[BooleanQuery]) {
getHitTerms(q, searcher, docId)
} else if (searcher.explain(q, docId).isMatch()) {
if (q.isInstanceOf[TermQuery]) {
List(c.getQuery().asInstanceOf[TermQuery].getTerm().text())
} else if (q.isInstanceOf[PhraseQuery]) {
List(c.getQuery().asInstanceOf[PhraseQuery].getTerms().map(_.text()).mkString(" "))
} else List.empty[String]
} else List.empty[String]
})
}
Run Code Online (Sandbox Code Playgroud)
罪魁祸首是asScala.这通常会将Java集合转换为缓冲区.你应该.toList在它之后添加,所以bq.clauses().asScala.toList.flatMap(c => {...