为什么我的Scala方法类型解析为Buffer而不是List?

Mar*_*cin 1 scala

对于下面的方法定义,当我显式设置返回类型时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)

mon*_*ack 5

罪魁祸首是asScala.这通常会将Java集合转换为缓冲区.你应该.toList在它之后添加,所以bq.clauses().asScala.toList.flatMap(c => {...