Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取从Scala中的密封父级派生的case对象实例_Scala - Fatal编程技术网

获取从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
})

完全正确非常感谢你。