加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读