This本质上是我的问题,但是接受的答案在返回符号而不是案例对象本身时停止。
从理论上讲,这应该很容易:
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)()
}
}
这很有效!
......除了它们与Parent
密封特征中包含的实例相比,它们是全新的实例;万岁,我已经破坏了"案件对象是单身"假设!
我可以在我的equals
密封特征中覆盖hashCode
和Parent
并完成它,但我更喜欢某种方法来获取那些特定的} em> case对象而不是碰巧看起来像它们的对象。这可能吗?如果这有任何区别,我在2.11。
答案 0 :(得分:3)
假设您在引用的帖子中使用sealedDescendants
方法,我相信您应该能够获得基础的object
:
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
})