我正在使用反射来创建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。)
答案 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作为你想要的类型的表示。