我有以下内容:
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
答案 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
的原因。