отражение scala, тип приведения с asInstanceOf - PullRequest
2 голосов
/ 05 октября 2011

у меня

trait T
class C extends T

скомпилировано в файлы .class. Запустите scala с -cp <...>, чтобы получить тип 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 Ответ

4 голосов
/ 05 октября 2011

Вы должны загружать класс C из загрузчика классов, отличного от загружаемого T.

Вы поместили T и C в путь к классам REPLs, поэтому одним из вариантов будет загрузка 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...