scala新手 - 如何从Map[String,String]
创建Map[String, Any]
Map[String,Any]
的值是字符串,但我不知道如何施放或以其他方式胁迫" Any
"输入" String
"类型。
答案 0 :(得分:3)
首先有一个Map[String, Any]
是一个标志可能已经脱轨的标志,虽然没有任何代码可以查看,但我无法真正帮助你。通常,当您开始看到Any
和其他超级泛型类型被推断时,Scala的类型系统会告诉您,您编写的代码并不代表您认为的含义。
如果真的想要这样做,你可以这样做:
scala> val m = Map("foo" -> 5, "bar" -> 7.6, "baz" -> "qux")
m: scala.collection.immutable.Map[String,Any] = Map(foo -> 5, bar -> 7.6, baz -> qux)
scala> m.mapValues(_.toString)
res0: scala.collection.immutable.Map[String,String] = Map(foo -> 5, bar -> 7.6, baz -> qux)
答案 1 :(得分:3)
正如您所提到的,地图中的所有值都是字符串,您只需使用asInstanceOf
即可。如果您的假设不正确,您将收到运行时异常,如下所示:
$ scala
Welcome to Scala version 2.9.2 (OpenJDK 64-Bit Server VM, Java 1.7.0_55).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val m:Map[String, Any] = Map("foo" -> 5, "bar" -> 7.6, "baz" -> "qux")
m: Map[String,Any] = Map(foo -> 5, bar -> 7.6, baz -> qux)
scala> val m2: Map[String, Any] = Map("foo" -> "5", "bar" -> "7.6", "baz" -> "qux")
m2: Map[String,Any] = Map(foo -> 5, bar -> 7.6, baz -> qux)
scala> m2.asInstanceOf[Map[String, String]]
res0: Map[String,String] = Map(foo -> 5, bar -> 7.6, baz -> qux)
当所有值实际上都是String
类型时,这是完美的。
scala> res0("foo")
res5: String = 5
注意你错误的假设:
scala> m.asInstanceOf[Map[String, String]]
res2: Map[String,String] = Map(foo -> 5, bar -> 7.6, baz -> qux)
scala> res2("foo")
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at .<init>(<console>:10)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:25)
at java.lang.Thread.run(Thread.java:744)
答案 2 :(得分:0)
由编译器推断的Map[String,Any]
的示例包括
val a = Map( "s" -> 1, "t" -> "w" )
a: scala.collection.immutable.Map[String,Any] = Map(s -> 1, t -> w)
Int
和String
的至少常见类型为Any
。
将toString
应用于地图中的每个值。
答案 3 :(得分:0)
正如其他人已经提到的那样,首先有一个Any
的事实表明某个地方出了问题。正确的解决方案是弄清楚哪里出了问题并修复它。
但是,如果确实想要将所有值都转换为String
s(这会绕过类型系统,因此你不应该你知道如何做到这一点:
val anyMap: Map[String, Any] = Map("foo" -> "bar", "baz" -> "qux")
val stringMap = anyMap.mapValues(_.asInstanceOf[String])
// => stringMap: Map[String, String] = Map(foo -> bar, baz -> qux)