如何在scala中存储不同的值类型

如何在scala中存储不同的值类型,scala,Scala,我可能有一个简单而愚蠢的问题,如何使用Scala映射存储不同的值类型,例如,我希望映射同时存储字符串和双值,我尝试了以下代码: var yaraMap: Map[String, AnyRef] = Map() yaraMap+={"as"->10.0} yaraMap+={"bb"->'val'} 但是它告诉了类型不匹配,我怎样才能解决这个问题,谢谢 将地图定义为 val yaraMap: Map[String, Any] = Map() Any是Double和String的常见

我可能有一个简单而愚蠢的问题,如何使用Scala映射存储不同的值类型,例如,我希望映射同时存储字符串和双值,我尝试了以下代码:

var yaraMap: Map[String, AnyRef] = Map()
yaraMap+={"as"->10.0}
yaraMap+={"bb"->'val'}
但是它告诉了类型不匹配,我怎样才能解决这个问题,谢谢

将地图定义为

val yaraMap: Map[String, Any] = Map()
Any是Double和String的常见超类型

下图演示了AnyVal和AnyRef之间的关系。String是AnyRef的子类型,Double是AnyVal的子类型,它们的公共超类型是Any

将地图定义为

val yaraMap: Map[String, Any] = Map()
Any是Double和String的常见超类型

下图演示了AnyVal和AnyRef之间的关系。String是AnyRef的子类型,Double是AnyVal的子类型,它们的公共超类型是Any


大卫·弗兰克的回答很好。这里有一个使代码类型安全的小改进:Any和AnyRef允许您向映射添加任何其他类型,而无需编译器抱怨

如果只希望值为双精度或字符串,可以执行以下操作:

var yaraMap: Map[String, Either[Double, String]] = Map() 
yaraMap+={"as"->Left(10.0)}
yaraMap+={"bb"->Right("val")}
可以说更为冗长,但至少如果您尝试添加,比如列表或任何其他类型,它会中断

yaraMap+={"as"->Left(34)}
 <console>:9: error: type mismatch;
 found   : List[String]
 required: Double
              yaraMap+={"as"->Left(List("a"))}

大卫·弗兰克的回答很好。这里有一个使代码类型安全的小改进:Any和AnyRef允许您向映射添加任何其他类型,而无需编译器抱怨

如果只希望值为双精度或字符串,可以执行以下操作:

var yaraMap: Map[String, Either[Double, String]] = Map() 
yaraMap+={"as"->Left(10.0)}
yaraMap+={"bb"->Right("val")}
可以说更为冗长,但至少如果您尝试添加,比如列表或任何其他类型,它会中断

yaraMap+={"as"->Left(34)}
 <console>:9: error: type mismatch;
 found   : List[String]
 required: Double
              yaraMap+={"as"->Left(List("a"))}

谢谢David,为什么AnyRef和Object不好,但是请随便。因为Double不是AnyRef,而是AnyVal非常感谢David的精彩图片:谢谢David,为什么AnyRef和Object不好,但是请随便。因为Double不是AnyRef,而是AnyVal非常感谢David的精彩图片: