我有
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
答案 0 :(得分:4)
您必须从不同的类加载器加载类C
,而不是加载T
。{/ p>
您已将T
和C
放在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特定的问题了。