有没有一种方法可以使用反射类型强制转换Scala对象?
我正在使用反射创建Scala对象。我没有现成的“t”访问权限,要对一个对象进行类型转换,通常如下所示:有没有一种方法可以使用反射类型强制转换Scala对象?,scala,reflection,Scala,Reflection,我正在使用反射创建Scala对象。我没有现成的“t”访问权限,要对一个对象进行类型转换,通常如下所示: def makeOne[T](o:Object) = o.asInstanceOf[T] def analyze[T](o:Object)(implicit tt:TypeTag[T]) = {...} 我有一个宇宙。输入tho。在我之前的处理过程中,我会这样做: def makeOne[T](o:Object) = o.asInstanceOf[T] def analyze[T](o:
def makeOne[T](o:Object) = o.asInstanceOf[T]
def analyze[T](o:Object)(implicit tt:TypeTag[T]) = {...}
我有一个宇宙。输入tho。在我之前的处理过程中,我会这样做:
def makeOne[T](o:Object) = o.asInstanceOf[T]
def analyze[T](o:Object)(implicit tt:TypeTag[T]) = {...}
我保存了tt.tpe,很久以后,当我创建一个类型为T的对象时,我丢失了“T”,但我仍然保留了tt.tpe
是否有任何方法可以使用这个宇宙。Type-to-Type-cast我的对象而无需使用“T”,如.asInstanceOf[T]
(顺便说一句,我可以使用反射来创建对象……只是创建的对象不知道它的类型。它只是认为它是任意的。)Shapeless有一个工具来判断一个投射是否合理
scala> import shapeless._, Typeable._
import shapeless._
import Typeable._
scala> class C
defined class C
scala> val c: AnyRef = new C
c: AnyRef = C@5e1e2bb6
scala> implicitly[Typeable[C]]
res0: shapeless.Typeable[C] = Typeable[C]
scala> res0.cast(c)
res1: Option[C] = Some(C@5e1e2bb6)
scala> res0.cast("nope")
res2: Option[C] = None
scala> val vs: AnyRef = List(1,2,3)
vs: AnyRef = List(1, 2, 3)
scala> implicitly[Typeable[List[Int]]].cast(vs)
res3: Option[List[Int]] = Some(List(1, 2, 3))
scala> implicitly[Typeable[List[String]]].cast(vs)
res4: Option[List[String]] = None
我看到可键入宏只使用了宏中的WeakTypeTag。当然,您可以传递一个Typeable作为您想要返回的类型的表示。您遇到的主要问题是,
asInstanceOf
是一个编译时构造,但是您使用的是运行时反射。如果您不知道要在编译时强制转换到的类型,那么强制转换有什么用?您应该保留t
——我想不出还有tt
但不能传入t
的情况。而且,这听起来有点像XY问题。。。