将案例类的伴随对象用作类型参数时编译错误

时间:2014-06-17 21:29:18

标签: scala spray

我使用case类为scala创建了一些json消息。例如:

  case class Foo(name: String, attrs: List[String])
  implicit val fooFormat = jsonFormat2(Foo)
  object Foo {
    case class Invalid(error: String)
  }
  case class Bar(name: String, kv: Map[String, String])
  implicit val barFormat = jsonFormat2(Bar)

在上面的代码段中,barFormat编译,但fooFormat没有:

type mismatch; found : Foo.type required: (?, ?) => ? 
 Note: implicit value barFormat is not applicable here because it comes 
 after the application point and it lacks an explicit result type

我不想使用barFormat代替fooFormat,我理解一个案例类会自动生成一个伴随对象,但我不明白为什么这里有编译错误,并且错误信息对我来说很难破译。有谁知道这里的问题是什么以及如何解决它,最好不要删除我的Foo伴侣对象?

3 个答案:

答案 0 :(得分:8)

从编译错误看,jsonFormat2需要一个双参数函数。你的意思是将FooBar的构造函数传递给它吗?如果是,您应该Foo.applyBar.apply

答案 1 :(得分:4)

Case类伴随对象默认会扩展其中一个函数特征。 object Foo会扩展((String, List[String]) => Foo),但是当您手动定义它时,您没有扩展该特征。这就是为什么你无法将它传递给期待jsonFormat2的{​​{1}}。如果进行以下更改,则应编译代码:

(?, ?) => ?

答案 2 :(得分:1)

Spray.json documentation建议比@ wingedsubmariner的建议更简单:

  

如果您明确声明了案例类的伴随对象   上面的符号将停止工作。你必须明确提到   配对对象的apply方法来解决这个问题:

因此问题的更正变为:

implicit val fooFormat = jsonFormat2(Foo.apply)

补充说:这实际上也是@geoffliu在答案中的建议。