有没有一种方法可以使用反射类型强制转换Scala对象?

有没有一种方法可以使用反射类型强制转换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:

我正在使用反射创建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: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问题。。。