0

我有以下内容:

trait C {}

object O {
    case class Foo(bar: String) extends C
}

我想从一个字符串中实例化 Foo。直到我实现了实例化 Foo,但我无法转换为 C。我正在使用:

val ob = runtimeMirror.staticModule("O.Foo")
val foo = runtimeMirror.reflectModule(ob).instance

现在 foo 是 O.Foo 的一个实例,但它不能转换为 C。

val c = foo.asInstanceOf[C] 

最后一行返回:

O$foo$ cannot be cast to C
4

2 回答 2

0

解决方案比我想象的要容易得多。

Class.forName("O$Foo").newInstance

应该注意的是,这个解决方案需要Foo一个没有参数的构造函数。最后一个条件对我的代码来说不是问题,所以它被解决了。

于 2017-08-14T09:23:37.917 回答
-1

扩展特征的案例类将仅在其类中实现,而不是在其伴生对象中,例如,请参阅:

trait C {}

object O {
  case class Foo(bar: String) extends C
  case class Foo2(bar: String) extends C
  object Foo2 extends C
}

object Q extends App {
  import scala.reflect.runtime.universe._
  val rm = runtimeMirror(getClass.getClassLoader)

  for (ref <- Seq("O.Foo", "O.Foo2")) {
    val ob = rm.staticModule(ref)
    val foo = rm.reflectModule(ob).instance
    println(foo.isInstanceOf[C])
  }
}

这打印:

错误的

真的

当您指的是staticModules 时,您指的是伴随对象,这就是C您正在测试的类未实现的原因。

于 2017-08-13T16:45:21.730 回答