scala反射,使用asInstanceOf进行强制转换

时间:2011-10-05 10:18:21

标签: scala reflection types casting

我有

trait T
class C extends T

编译为.class文件。使用-cp <...>运行scala以使类型T可用。然后使用反射加载C类:

val loader = ScalaClassLoader fromURLs (/* List[URL] */)
val anyC = loader.tryToInitializeClass("C") getOrElse (/* throw something */)
val classC = anyC.asInstanceOf[Class[T]]

如何将classC.newInstance转换为类型T

val objC = classC.newInstance.asInstanceOf[T] 
// yields java.lang.ClassCastException: C cannot be cast to T

1 个答案:

答案 0 :(得分:4)

您必须从不同的类加载器加载类C,而不是加载T。{/ p>

您已将TC放在REPL类路径中,因此一个选项是通过系统类加载器加载C。样本REPL会话,

scala> val loader = scala.tools.nsc.util.ScalaClassLoader.getSystemLoader
loader: scala.tools.nsc.util.ScalaClassLoader =
  scala.tools.nsc.util.ScalaClassLoader$$anon$1@985d2e0

scala> val anyC = loader.tryToInitializeClass("C") getOrElse (sys.error("Boom"))
anyC: Class[Nothing] = class C

scala> val classC = anyC.asInstanceOf[Class[T]]
classC: Class[T] = class C

的Nb。这不再是Scala特定的问题了。