1

假设我有一个类层次结构,如:

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

你会如何解决这个问题?

4

1 回答 1

1

如果您可以制作Event密封特征,那么您可以使用此处解释的宏来迭代其子类,方法是引入SealedExample具有所需辅助方法的对象。该示例仅获取扩展密封特征的对象,但您可以轻松修改它以返回classOf每个子类的 。然后你可以这样做:

override val typeHints = ShortTypeHints(SealedExample.values[Event].toList)

否则,不幸的是,Scala 中没有本地方法可以在编译时生成特征的子类型列表。

于 2015-04-09T17:03:47.500 回答