对于下面的方法定义,当我将返回类型显式设置为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]
})
}
答案 0 :(得分:5)
罪魁祸首是asScala
。这通常会将Java集合转换为缓冲区。您应在其后添加.toList
,因此bq.clauses().asScala.toList.flatMap(c => {...