获取从Scala中的密封父级派生的case对象实例
这基本上是我的问题,但公认的答案只是返回它们的符号,而不是案例对象本身 理论上,这应该很容易:获取从Scala中的密封父级派生的case对象实例,scala,Scala,这基本上是我的问题,但公认的答案只是返回它们的符号,而不是案例对象本身 理论上,这应该很容易: def getCaseObjects(enumType: Type) = { val m = ru.runtimeMirror(getClass.getClassLoader) enumType.typeSymbol.asClass.knownDirectSubclasses map { subclass => val enumObjMirror = m.refl
def getCaseObjects(enumType: Type) = {
val m = ru.runtimeMirror(getClass.getClassLoader)
enumType.typeSymbol.asClass.knownDirectSubclasses map { subclass =>
val enumObjMirror = m.reflectClass(subclass.asClass.toType.typeSymbol.asClass)
enumObjMirror.reflectConstructor(subclass.asClass.toType.decl(ru.termNames.CONSTRUCTOR).asMethod)()
}
}
这很有效
…除了与它们的父项中包含的实例相比,它们是全新的实例;万岁,我打破了“案例对象是单例的”假设
我可以在我的sealed trait中重写equals
和hashCode
并完成它,但是我更喜欢一种方法来获取那些特定的case对象,而不是那些碰巧看起来像它们的对象。这可能吗?如果这有什么区别的话,我就在2.11上。假设您在引用的帖子中使用了sealeddescentants
方法,我相信您应该能够得到底层的对象,如:
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{ universe => ru }
val m = ru.runtimeMirror(getClass.getClassLoader)
val descendants = sealedDescendants[Parent] getOrElse Set.empty
val objects = descendants.map({ desc =>
val mod = m.staticModule(desc.asClass.name.decoded)
m.reflectModule(mod).instance
})
完全正确非常感谢你。