假設我們的東西的模型,表示爲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
或宏的解決方案都會綽綽有餘。
英里薩賓的答案http://stackoverflow.com/questions/23192760/safely-copying-fields-between-case-classes-of-different-types有幫助嗎? – 2014-12-28 04:54:46