[英]scala reflection, cast type with asInstanceOf
I have 我有
trait T
class C extends T
compiled to .class files. 编译为.class文件。 Run scala with -cp <...>
to have type T
available. 使用-cp <...>
运行scala以使类型T
可用。 Then load class C using reflection: 然后使用反射加载C类:
val loader = ScalaClassLoader fromURLs (/* List[URL] */)
val anyC = loader.tryToInitializeClass("C") getOrElse (/* throw something */)
val classC = anyC.asInstanceOf[Class[T]]
How can I cast a classC.newInstance
into type T
like 我如何将classC.newInstance
转换为T
型
val objC = classC.newInstance.asInstanceOf[T]
// yields java.lang.ClassCastException: C cannot be cast to T
You must be loading class C
from a different classloader than the one T
is being loaded from. 您必须从不同于从中加载T
的其他类加载器中加载C
类。
You've put both T
and C
on the REPLs classpath, so one option would be to load C
via the system classloader. 您已将T
和C
放置在REPL的类路径上,因此一种选择是通过系统类加载器加载C
Sample REPL session, 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. 铌。 this isn't really a Scala-specific question any longer. 这实际上不再是针对Scala的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.