【发布时间】:2014-10-27 06:14:33
【问题描述】:
假设我们有一个模型,表示为case class,这样
case class User(firstName:String,lastName:String,age:Int,planet:Option[Planet])
sealed abstract class Planet
case object Earth extends Planet
case object Mars extends Planet
case object Venus extends Planet
本质上,通过使用反射或宏,能够获取用户案例类的字段名称,以及字段表示的类型。这也包括Option,即在提供的示例中,需要能够区分Option[Planet] 和Planet
在 scala'ish 伪代码中,类似这样的
val someMap = createTypedMap[User] // Assume createTypedMap is some function which returns map of Strings to Types
someMap.foreach{case(fieldName,someType) {
val statement = someType match {
case String => s"$fieldName happened to be a string"
case Int => s"$fieldName happened to be an integer"
case Planet => s"$fieldName happened to be a planet"
case Option[Planet] => s"$fieldName happened to be an optional planet"
case _ => s"unknown type for $fieldName"
}
println(statement)
}
我目前知道您不能执行 case Option[Planet] 之类的操作,因为它会被 Scala 擦除,但是即使使用 TypeTags,我也无法编写执行我想做的代码的代码,并可能处理其他类型(如Either[SomeError,String])。
目前我们使用的是最新版本的 Scala (2.11.2),因此任何使用 TypeTags 或 ClassTags 或宏的解决方案都绰绰有余。
【问题讨论】:
-
Miles Sabin 对stackoverflow.com/questions/23192760/… 的回答有帮助吗?
标签: scala generics reflection macros scala-macros