scala – 使用Map#getOrElse键入怪异
发布时间:2020-12-16 09:08:53 所属栏目:安全 来源:网络整理
导读:考虑 scala val m = Map('a - 3,'b - 4)m: scala.collection.immutable.Map[Symbol,Int] = Map('a - 3,'b - 4)scala val d: Double = m.getOrElse('c,0)console:8: error: type mismatch; found : AnyVal required: Double val d: Double = m.getOrElse('c,0
考虑
scala> val m = Map('a -> 3,'b -> 4) m: scala.collection.immutable.Map[Symbol,Int] = Map('a -> 3,'b -> 4) scala> val d: Double = m.getOrElse('c,0) <console>:8: error: type mismatch; found : AnyVal required: Double val d: Double = m.getOrElse('c,0) ^ scala> m.getOrElse('c,0) res0: Int = 0 scala> m.getOrElse('a,0) res1: Int = 3 为什么Scala认为getOrElse调用返回AnyVal,即使它显然返回一个Int? 此外,即使这失败也会出现同样的错误: scala> val x: Double = m.getOrElse('a,0): Double <console>:8: error: type mismatch; found : AnyVal required: Double val x: Double = m.getOrElse('a,0): Double 但这有效: scala> val x: Double = m.getOrElse('a,0): Int x: Double = 3.0 这发生在2.11.x;我没有在2.10.x上试过它. 解决方法
我正试图在阅读-Ytyper-debug输出方面做得更好.
对于期望的Double类型,0的类型取为Double,0.0.这是因为人们讨厌的转换次数不断扩大. 这是在解决B1之前. B1被视为AnyVal,因为它是A / Int和Double的lub. | |-- Double TYPEmode (site: value d in $iw) | | -> Double | |-- m.getOrElse(scala.Symbol("c"),0) : pt=Double BYVALmode-EXPRmode (site: value d in $iw) | | |-- m.getOrElse BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value d in $iw) | | | |-- m EXPRmode-POLYmode-QUALmode (silent: value d in $iw) | | | | -> m.type (with underlying type scala.collection.immutable.Map[Symbol,Int]) | | | [adapt] [B1 >: B](key: A,default: => B1)B1 adapted to [B1 >: B](key: A,default: => B1)B1 | | | -> (key: Symbol,default: => B1)B1 | | |-- scala.Symbol("c") : pt=Symbol BYVALmode-EXPRmode-POLYmode (site: value d in $iw) | | | |-- scala.Symbol BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value d in $iw) | | | | |-- scala.Symbol.apply BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value d in $iw) | | | | | -> (name: String)Symbol | | | | [adapt] Symbol.type adapted to (name: String)Symbol | | | | -> (name: String)Symbol | | | |-- "c" : pt=String BYVALmode-EXPRmode (silent: value d in $iw) | | | | -> String("c") | | | -> Symbol | | |-- 0 : pt=Double EXPRmode-POLYmode (site: value d in $iw) | | | -> Double(0.0) | | solving for (B1: ?B1) <console>:8: error: type mismatch; found : AnyVal required: Double val d: Double = m.getOrElse('c,0) ^ | | -> <error> 另外,-xprint:typer显示 m.getOrElse[AnyVal](scala.Symbol.apply("c"),0.0); spec explains(案例3方法)args是使用预期的param类型进行类型检查的,这就是为什么你得到转换为Double的原因,而不是让方法返回在赋值中扩展为Double的Int. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |