繁体   English   中英

伴随对象的实例案例类

[英]Instance case class from companion object

我有以下内容:

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

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

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

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

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

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原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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