gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:49:37 26 4
gpt4 key购买 nike

This本质上是我的问题,但接受的答案止于返回它们的符号而不是 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 中包含的实例相比,它们是全新的实例。密封性状;万岁,我打破了“案例对象是单例”的假设!

我可以覆盖 equalshashCode在我的 Parent密封特征并完成它,但我更喜欢一种方法来获取那些特定的案例对象,而不是那些碰巧看起来像它们的对象。这可能吗?如果这有什么不同的话,我在 2.11 上。

最佳答案

假设您使用 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
})

关于scala - 获取从 Scala 中的密封父级派生的案例对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com