[英]In Scala is there a way to reference the Companion Object from within an instance of a Case Class?
[英]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.