有没有办法使用反射来键入Scala对象?

时间:2016-07-26 13:59:08

标签: scala reflection

我正在使用反射来创建Scala对象。我没有准备好访问'T',就像通常希望的那样输入一个对象:

def makeOne[T](o:Object) = o.asInstanceOf[T]

我确实有一个宇宙。类型。在我的处理早期,我做了类似的事情:

def analyze[T](o:Object)(implicit tt:TypeTag[T]) = {...}

我保存了tt.tpe,很久以后,当我创建一个T型对象时,我已经丢失了'T',但我仍保留tt.tpe。

有没有办法可以使用这个Universe.Type来输入我的对象,而不需要'T',如.asInstanceOf [T]?

(顺便说一句,我可以使用反射创建对象就好了...只是创建的对象不知道它的类型。它只是认为它是Any。)

1 个答案:

答案 0 :(得分:0)

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

我看到Typeable宏只使用了宏内部的WeakTypeTag。当然,你可以传递一个Typeable作为你想要的类型的表示。