首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任何=>本机格式

任何=>本机格式
EN

Stack Overflow用户
提问于 2021-05-10 20:04:02
回答 1查看 70关注 0票数 1

我有一个Map[_, Any]类型的映射,我想以它们的本机格式提取值(而不诉诸.asInstanceOf[_])。

就像这样..。

代码语言:javascript
运行
复制
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的形式出现,而不是IntString

代码语言:javascript
运行
复制
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的包装..。

代码语言:javascript
运行
复制
case class MyMap(m: Map[String, Any]) {
  def get[A](k: String)(implicit ev: Option[Any] => Option[A]): Option[A] = m.get(k)
}

但这还是以Any的形式出现。我只是不知道如何转换任何=>本机。

所以我的问题是。

  1. 为什么会失败?
  2. 有什么更好的方法来获取其原生格式的值?最简单和/或没有外部依赖是理想的..。但老实说,我对任何事情都持开放态度(尽管我现在还在Scala2.11上)。

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-10 21:33:13

由于注释中已经解释过的原因,您无法猜测运行时类型--这个信息不存在,一旦它是Any,所有类型的信息都丢失了,您就无能为力了。

因此,您必须自己提供预期的类型。.as[T]助手方法如何?

代码语言:javascript
运行
复制
// 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)

这个会打印出来

代码语言:javascript
运行
复制
42
This is a test

简要说明:

everything.

  • The

  • As包装器“皮条客”所有对象,并将.as方法附加到unapply中,在Option.中进行检查、转换和包装。

它不适用于一般类型,如List[Int]List[String]等,因为这些信息在运行时根本不可用。

编辑:谢谢@MarioGalic大大简化了解决方案。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67477009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档