隐含值未在范围中应用

时间:2014-07-30 10:48:19

标签: scala playframework playframework-2.3

我正在尝试将嵌入对象中的隐式Write声明导入到一个函数中,该函数根据一组case类生成一个JSON对象。

case class TestModel(test:String)

object TestModel {

  def manyToJSON(models: List[TestModel]) = {
    import writes.micro
    Json.toJson(models) 
  }

  object writes {
    implicit val micro = Json.writes[TestModel]
  }
}

不幸的是,scala编译器抱怨:

  

找不到类型为List [models.TestModel]的Json序列化程序。尝试为此类型实现隐式写入或格式。

有趣的部分是,如果我在方法中使用写对象作为纯表达式,那么它的工作原理。

object TestModel {

  def manyToJSON(models: List[TestModel]) = {
    import writes.micro
    writes.micro
    Json.toJson(models) 
  }

  object writes {
    implicit val micro = Json.writes[TestModel]
  }
}

我如何更改我的代码以隐含范围?

1 个答案:

答案 0 :(得分:1)

案例类隐式不起作用的原因是它只是一个定义而不是值。用例对象将解决像object这样的问题。请考虑以下代码:

object MainClass {


  def main(args: Array[String]) {

    TestModel.manyToJSON(Nil)
  }
}

case class TestModel(test:String)

object TestModel {

  def manyToJSON(models: List[TestModel]) = {
    import writes._
    def print(implicit x: Int) = {
      println(x)
    }

    print // print 3
  }

  object writes {
    implicit val x: Int = 3
    //implicit val x = 3 //compilation error

  }
}