![](/img/trans.png)
[英]In Scala, How to create TypeTag[Map[A,B]], while only TypeTag[A] and TypeTag[B] are available?
[英]In Scala, how to cast a value when a TypeTag is available
特定
Any
的值 TypeTag
我怎樣才能施展價值
不幸的是,以下代碼段無法編譯
val v: Any = 123
val tag = typeTag[Int]
val i = v.asInstanceOf[t.tpe]
用這個
import scala.reflect.ClassTag
def getTypedArg[T: ClassTag](any: Any): Option[T] = {
any match {
case t: T => Some(t)
case invalid =>
None
}
}
用法
scala> getTypedArg[Int](5)
res1: Option[Int] = Some(5)
scala> getTypedArg[Int]("str")
res2: Option[Int] = None
來源: 從ClassTag中檢索類名
編輯-1
正如@Aki所要求的那樣 ,也可以通過這種黑客攻擊TypeTag
import reflect.runtime.universe._
import scala.reflect.ClassTag
def typeToClassTag[T: TypeTag]: ClassTag[T] = {
ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}
def getTypedArg2[T: TypeTag](any: Any): Option[T] = {
implicit val c: ClassTag[T] = typeToClassTag[T]
any match {
case t: T => Some(t)
case invalid =>
None
}
}
您可以編寫自己的方法來執行轉換。
(請注意,此方法永遠不會拋出ClassCastExceptions)
def cast[A](a: Any, tag: TypeTag[A]): A = a.asInstanceOf[A]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.