来自伴随对象的实例案例类

时间:2017-08-13 09:34:28

标签: scala reflection scala-macros scala-reflect

我有以下内容:

trait C {}

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

我想从String中实例化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

2 个答案:

答案 0 :(得分:0)

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

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

应该注意,使用此解决方案需要Foo具有不带args的构造函数。最后一个条件对我的代码来说不是问题,因此它已经解决了。

答案 1 :(得分:-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])
  }
}

打印:

  

     

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