我有一个 type 的地图Map[_, Any]
,我想以它们的本机格式提取值(不求助于.asInstanceOf[_]
)。
像这样的东西...
val m: Map[String, Any] = Map("i" -> 1, "s" -> "test")
val i: Option[Int] = m.get("i")
val s: Option[String] = m.get("s")
显然那是失败的。
我不喜欢这种方法,但我想我可以做这样的事情......但即使这样仍然出现Any
而不是Int
or String
。
trait MyType[A] {
def value: A
}
implicit class MyInt(i: Int) extends MyType[Int] { def value: Int = i }
implicit class MyString(s: String) extends MyType[String] { def value: String = s }
val m: Map[String, MyType[_]] = Map("i" -> 1, "s" -> "test")
val i: Option[Int] = m.get("i").map(_.value)
val s: Option[String] = m.get("s").map(_.value)
然后我想也许是一些包装Map
...
case class MyMap(m: Map[String, Any]) {
def get[A](k: String)(implicit ev: Option[Any] => Option[A]): Option[A] = m.get(k)
}
但这仍然是Any
. 我只是不知道如何转换 Any => native。
所以我的问题是...
- 为什么会失败?
- 以原始格式获取值的更好方法是什么?最简单和/或没有外部依赖是理想的......但我真的对任何事情都持开放态度(尽管需要注意的是我现在仍在使用 scala 2.11)。
谢谢!