Scala 2.13迁移时重载方法w报错:参数类型不匹配问题咨询
Scala 2.13迁移后mapValues引发的方法匹配错误
问题代码
def w(value : java.util.Map[String, java.util.List[String]]) : ParamPair[Map[String, (String, String)]] = { val scalaMap = value.asScala.toMap val newMap = scalaMap.mapValues[(String, String)]( (l : java.util.List[String]) => { if(l.size() != 2) throw new IllegalArgumentException("A tuple map should contain exactly 2 elements ") val lScala = l.asScala.toArray (lScala(0), lScala(1)) }) w(newMap) }
报错信息
error: overloaded method w with alternatives: [ERROR] (value: java.util.Map[String,java.util.List[String]])org.apache.spark.ml.param.ParamPair[Map[String,(String, String)]] <and> [ERROR] (value: Map[String,(String, String)])org.apache.spark.ml.param.ParamPair[Map[String,(String, String)]] [ERROR] cannot be applied to (scala.collection.MapView[String,(String, String)]) [ERROR] w(newMap) [ERROR] ^
问题原因
Scala 2.13对mapValues方法的返回类型做了颠覆性修改:
- 在Scala 2.12及更早版本中,
mapValues直接返回Map类型,属于完整的Map实现。 - 但在Scala 2.13里,
mapValues返回的是**scala.collection.MapView**——这是一种懒加载的视图结构,不会立即执行所有映射转换,只有在访问元素时才计算结果。
你的重载方法w仅支持两种参数类型:java.util.Map[...]和Map[String, (String, String)],而MapView与Map是完全不同的类型,编译器无法找到匹配的重载方法,因此抛出上述错误。
内容的提问来源于stack exchange,提问作者Alexandros Mouzakidis
相关产品推荐
相关产品推荐

