确保scala父类具有与之关联的格式化程序

时间:2014-06-17 00:44:49

标签: scala

我有一个简单的类型层次结构,如下所示:

  sealed abstract class Config
  object Config {
    case class Valid(name: String, traits: List[String]) extends Config
    case class Invalid(error: String) extends Config
  }
  implicit val validFormat = jsonFormatFor(Config.Valid)
  implicit val invalidFormat = jsonFormatFor(Config.Invalid)

我还有客户端代码执行以下操作:

newHttpServer().addHandler("/config", extractConfig)

extractConfig方法执行一些计算并返回Config.ValidConfig.Invalid,服务器将使用隐式json格式对象自动转换为json。我的问题是存在编译器错误,因为extractConfig返回Config

type mismatch; found : Config 
     required: spray.httpx.marshalling.ToResponseMarshallable

如果我将extractConfig的返回类型更改为Config.Valid,那么服务器代码会进行编译,因为jsonFormatFor(...)会提供必要的自动类型转换,以便设置ToResponseMarshaller(尽管我承认我也不完全理解这种自动转换,对于scala来说有些新东西。有没有一种简单的方法可以通过声明Config的任何子类必须是ToResponseMarshaller来解决这个问题,因为ToResponseMarshaller是一个似乎通过隐式转换提供的特征?

1 个答案:

答案 0 :(得分:2)

如果您只有Config.Valid和Config.Invalid,则extractConfig返回Either [Config.Valid,Config.Invalid]就足够了。那么你上面的格式应该可行。

另一种可能性是编写自己的jsonwriter(请参阅邮件列表中的thread)。