【发布时间】:2016-01-25 07:19:37
【问题描述】:
我可能有一个简单的愚蠢问题,如何使用 Scala Map 来存储不同的值类型,例如,我希望 Map 存储字符串和双精度值,我尝试了以下代码:
var yaraMap: Map[String, AnyRef] = Map()
yaraMap+={"as"->10.0}
yaraMap+={"bb"->'val'}
但它告诉类型不匹配,我该如何解决这个问题,谢谢!
【问题讨论】:
标签: scala
我可能有一个简单的愚蠢问题,如何使用 Scala Map 来存储不同的值类型,例如,我希望 Map 存储字符串和双精度值,我尝试了以下代码:
var yaraMap: Map[String, AnyRef] = Map()
yaraMap+={"as"->10.0}
yaraMap+={"bb"->'val'}
但它告诉类型不匹配,我该如何解决这个问题,谢谢!
【问题讨论】:
标签: scala
将您的地图定义为
val yaraMap: Map[String, Any] = Map()
Any 是Double 和String 的通用超类型。
下图演示了AnyVal 和AnyRef 之间的关系。 String是AnyRef的子类型,Double是AnyVal的子类型,它们共同的超类型是Any。
【讨论】:
Double 不是AnyRef 它的AnyVal
大卫·弗兰克的回答很棒。这是使代码类型安全的一个小改进(注意:Any 和 AnyRef 将允许您将任何其他类型添加到 Map 而不会编译器抱怨)。
如果您只希望您的值是 Double 或 String,您可以这样做:
var yaraMap: Map[String, Either[Double, String]] = Map()
yaraMap+={"as"->Left(10.0)}
yaraMap+={"bb"->Right("val")}
可以说更冗长,但如果您尝试添加 List() 或任何其他类型,至少它会中断。
yaraMap+={"as"->Left(34)}
<console>:9: error: type mismatch;
found : List[String]
required: Double
yaraMap+={"as"->Left(List("a"))}
【讨论】: