了解Scala不可变映射行为

时间:2017-09-12 05:49:59

标签: scala immutability autoboxing

我使用了scala immutable map,如下所示。

val d =“4.55”

  1. 这很好。

    val  properties = Map("title"->"title" , "value" -> d )
    
  2. 它从[String,AnyRef]转换为[String,Any]

    val  properties = Map("title"->"title" , "value" -> d.toDouble )
    
  3. 无法从Double转换为Object,运行时错误

    val  properties:Map[String,Object] = Map("title"->"title" , "value" -> d.toDouble )
    

    为什么对象不能接受Double?

  4. 工作正常。

    val  properties:Map[String,Object] = Map("title"->"title" , "value" -> d.toDouble.asInstanceOf[Object] )
    
  5. 无法理解不可变地图行为的四种情况。

2 个答案:

答案 0 :(得分:1)

最重要的是:Scala没有像Java那样的原始类型。

Scala的 Double 是一个类,继承自 AnyVal ,拥有自己的方法

但Java的Object 是所有引用类型的基类,又名......

所以,你在这里做的是使用Object作为Double的基类。

在我看来,
Scala的 AnyRef 是Java的对象的相应类型。
Scala的 AnyVal 是Java 原始类型的对应类型。

答案 1 :(得分:1)

正如您可以看到Scala类层次结构...

Scala class hierarchy

... java.lang.Object的Scala等效项为AnyRef,类型String属于该系列,但Scala Double属于AnyVal 。当编译器必须协调这两种类型时,它会找到类型Any,如果没有强制(即强制转换),则无法将其提升为AnyRef / Object类型。

如果你有d.toSeq而不是d.toDouble,编译器会立即转到AnyRef / Object