在Scala中,当TypeTag可用时,如何强制转换值
给定在Scala中,当TypeTag可用时,如何强制转换值,scala,types,Scala,Types,给定 类型为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 { ca
- 类型为
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
}
}
用法
资料来源:
编辑-1 正如所要求的,它也可以使用
TypeTag
s来工作,使用这个hack
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
}
}
参考资料:您可以编写自己的方法进行铸造。
(请注意,此方法永远不会抛出ClassCastException)
你能举一个你想在哪里做这件事的例子吗?一般来说,完全按照你的要求去做是不可能的。备选方案取决于具体情况。@Jasper-M我问了一个更完整的问题来解释用例,参见:
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
}
}
def cast[A](a: Any, tag: TypeTag[A]): A = a.asInstanceOf[A]