Scala声明Vector[Candidate]类型后仍出现类型不匹配报错
错误根因
你在result + candidate处报错的核心原因是误用了Scala不可变Vector的元素追加操作符:
- Scala标准库的
Vector不存在接收元素类型作为参数的+方法 - 当编译器找不到匹配的
+方法签名时,会自动触发预定义的any2stringadd隐式转换:这个转换会给任意类型的对象添加一个+(other: String): String方法,用来做字符串拼接。这就是为什么错误提示显示需要传入String类型,但你实际传入了Candidate实例。
直接修复方法
将追加元素的操作符从+替换为:+即可。:+才是Scala不可变序列向尾部追加单个元素的标准操作:
def partysCandidate(party: String): Vector[Candidate] = { var result = Vector[Candidate]() for (candidate <- this.candidates) { if (candidate.party == party) result = result :+ candidate } result }
更地道的Scala实现
你当前的写法是指令式的循环累加,不符合Scala函数式编程的习惯。针对筛选集合元素的场景,直接用集合自带的filter方法即可,不需要手动声明var做循环,代码更简洁也更不容易出低级错误:
// 如果this.candidates本身就是Vector[Candidate],可以去掉末尾的.toVector def partysCandidate(party: String): Vector[Candidate] = candidates.filter(_.party == party).toVector
补充说明:Scala中只有Set、Map这类不保证顺序的集合,提供了+方法用来添加元素;有序序列(List、Vector等)追加单个元素到尾部用:+,在头部追加元素用+:,注意两个操作符的冒号位置是靠近集合一侧的。
内容的提问来源于stack exchange,提问作者hhp
相关产品推荐
相关产品推荐

