我希望返回一个包含不同数据类型值的映射,例如 (key - > String)和(key - > Int),但我可以使用Map Map [String,String]或Map [String,Int]。 我不能使用类,因为键的数量和顺序不固定。 有没有办法将String和Int包装到泛型类中,以便我可以将map返回为Map [String,Any]
答案 0 :(得分:1)
您可以使用HMap
作为@Harnish建议,但scala库中有另一种选择:Map[String, Either[Int, String]]
。只有当您知道某种类型或其他类型而且仅此类型时,它才适用。
可以Either[Int, String]
或Left(5)
创建Right("Hello")
类型。然后你可以使用匹配来测试值:
x match {
case Left(n) => println(s"$n is a number")
case Right(s) => println(s"$s is a string")
}
<强>更新强> 例如:
val dict = scala.collection.mutable.Map[String, Either[String, Int]]()
dict += ("a" -> Right(5))
dict += ("b" -> Left("Hello"))
dict map {
case (key, Right(n)) => println(s"For $key: $n is integer")
case (key, Left(s)) => println(s"For $key: $s is string")
}
答案 1 :(得分:0)
我不确定您是否可以使用标准集合库执行此操作,但可以使用shapeless HMap(异构映射)。这是文档中给出的示例,它与您所描述的内容非常匹配:
// Key/value relation to be enforced: Strings map to Ints and vice versa
class BiMapIS[K, V]
implicit val intToString = new BiMapIS[Int, String]
implicit val stringToInt = new BiMapIS[String, Int]
val hm = HMap[BiMapIS](23 -> "foo", "bar" -> 13)
//val hm2 = HMap[BiMapIS](23 -> "foo", 23 -> 13) // Does not compile
scala> hm.get(23)
res0: Option[String] = Some(foo)
scala> hm.get("bar")
res1: Option[Int] = Some(13)
注意,它不会给你一个Any,而是你必须在你的键/值对中指定有效的东西。我不确定这对你是否有帮助......