我有一个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或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的形式出现。我只是不知道如何转换任何=>本机。
所以我的问题是。
谢谢!
发布于 2021-05-10 21:33:13
由于注释中已经解释过的原因,您无法猜测运行时类型--这个信息不存在,一旦它是Any,所有类型的信息都丢失了,您就无能为力了。
因此,您必须自己提供预期的类型。.as[T]助手方法如何?
// This code is specifically for 2.11, please don't use it for more recent versions,
// see link below.
val m: Map[String, Any] = Map("i" -> 1, "s" -> "test")
import scala.reflect.{ ClassTag, classTag }
implicit class As(a: Any) {
def as[T](implicit ct: ClassTag[T]): Option[T] = ct.unapply(a)
}
println(m("i").as[Int].map(_ + 41).get)
println(m("s").as[String].map("This is a " + _).get)这个会打印出来
42
This is a test简要说明:
everything.
As包装器“皮条客”所有对象,并将.as方法附加到unapply中,在Option.中进行检查、转换和包装。它不适用于一般类型,如List[Int]和List[String]等,因为这些信息在运行时根本不可用。
编辑:谢谢@MarioGalic大大简化了解决方案。
https://stackoverflow.com/questions/67477009
复制相似问题