简体   繁体   English

Scala反射,使用asInstanceOf强制转换类型

[英]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. 您已将TC放置在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM