在Scala中获取从封闭父类继承的案例对象实例

4

这个问题与我的问题基本相同, 但是被接受的答案只返回它们的符号而不是case对象本身。

理论上,这应该很容易:

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封闭特质中包含的实例完全不同;太好了,我打破了“case对象是单例”的假设!

我可以在我的Parent封闭特质中重写equalshashCode,然后就完成了,但我更喜欢一种方法来获取那些特定的case对象,而不是看起来像它们的对象。这可能吗?如果有区别,我使用的是2.11。

1个回答

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

非常准确!非常感谢。 - helgridly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接