假设我有一个类层次结构,如:
trait Event
case class ThisEvent extends Event
case class ThatEvent extends Event
case class AnotherEvent extends Event
目前在我的序列化代码中,我必须使用它:
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "_t"
override val typeHints = ShortTypeHints(List(classOf[ThisEvent], classOf[ThatEvent], classOf[AnotherEvent]))
}
但我更喜欢这样的事情:
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "_t"
override val typeHints = ShortTypeHints(List(classOf[Event]))
}
你会如何解决这个问题?
答案 0 :(得分:1)
如果你可以使Event
成为一个密封的特征,那么你可以使用解释为here的宏来迭代它的子类,方法是引入带有所需辅助方法的SealedExample
对象。该示例仅获取扩展密封特征的对象,但您可以轻松修改它以返回每个子类的classOf
。然后你可以这样做:
override val typeHints = ShortTypeHints(SealedExample.values[Event].toList)
否则,遗憾的是,Scala中没有本地方法可以在编译时生成特征的子类型列表。