scala方法隐式转换不起作用

时间:2015-08-27 07:45:02

标签: scala implicit-conversion

我有一个Play 2.3项目,其中包含来自AJAX的自定义标头,需要传递给每个服务调用(进一步传递给Web服务)。我想把它变成一个隐含的参数,比如在这个愚蠢的例子中:

case class CriteriaHeaders(license: String)
case class Criteria(criteriaHeaders: CriteriaHeaders, id: Int)

class ProjectController(service: Service)  {
  implicit def criteriaToCiteriaHeaders(criteria: Criteria): CriteriaHeaders = criteria.criteriaHeaders
  def findName(criteria: Criteria) = {
    // implicit val criteriaHeaders: CriteriaHeaders = criteria.criteriaHeaders
    service
      .findName(criteria.id)
      .fold(
        error => error,
        name => name
      )
  }
}

class Service {
  def findName(id: Int)
              (implicit criteriaHeaders: CriteriaHeaders): Either[String, String] = ??? // TODO
}

(当然在实际项目中有一个ActionBuilder,一个Json解析器等。)

用法:

val controller = new ProjectController(new Service())
val name = controller.findName(Criteria(CriteriaHeaders("abc"), 123))

它没有编译,给出错误:

Error:(21, 17) could not find implicit value for parameter licenseHeaders: A$A172.this.CriteriaHeaders.findName(criteria.id)

但是,如果我取消注释隐式val,它就可以工作。为什么它不能使用隐式方法?

编辑: 如果有人发现这个有用,我从@ till-rohrmann那里得到了第二个建议,我把它隐含在CriteriaHeaders的伴随对象中,所以每个使用它的控制器都可以使用它。

object CriteriaHeaders {
  implicit def criteriaToCiteriaHeaders(implicit criteria: Criteria) = criteria.criteriaHeaders
}

0 个答案:

没有答案