获取从Scala中的密封父代派生的案例对象实例

时间:2015-08-28 20:40:48

标签: scala

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密封特征中覆盖hashCodeParent并完成它,但我更喜欢某种方法来获取那些特定的 case对象而不是碰巧看起来像它们的对象。这可能吗?如果这有任何区别,我在2.11。

1 个答案:

答案 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
})