提到自我类型的特质

时间:2014-06-28 13:50:52

标签: scala self-type

我编写了一个特性,可以将类自身序列化以查询字符串参数,并利用现有的JSON Writes实例。为了将该Writes实例用作参数,我需要知道混合该特征的类型。我正在使用类型参数(应该是类本身)和自我类型注释。我想知道是否有DRYer这样做的方式,这不需要类型参数?

这是我的代码:

trait ConvertibleToQueryString[T] {
  this: T =>

  /** Transformation of field names in obj to query string keys */
  def objToQueryStringMapping: Map[JsPath, JsPath] = Map.empty

  /**
   * Convert a model to a Map, for serialization to a query string, to be used
   * in a REST API call.
   * @param writes writer for `obj`
   * @return
   */
  def toQueryStringMap(implicit writes: Writes[T]): Map[String, String] = {
    // Get a map of key -> JsValue from obj
    val mapObj = Json.toJson(this).transform(moveKeys(objToQueryStringMapping)).get.value

    // Convert the JsValue values of the map to query strings
    mapObj.mapValues(jsValueToQueryStringValue).filter(_._2.nonEmpty).toMap
  }
}

,将被用作:

case class MyClass(param1: String, param2: Int) extends ConvertibleToQueryString[MyClass]

,最后的类型参数是令我烦恼的事情。它完全不受约束,但它应该只是“我混入的类的类型”。有没有办法表达这个?

1 个答案:

答案 0 :(得分:1)

为什么不使用 pimp - encrich-my-library模式:

implicit class ConvertibleToQueryString[T: Writes](x: T) {
  def objToQueryStringMapping: Map[JsPath, JsPath] = Map.empty

  def toQueryStringMap: Map[String, String] = {
    // Get a map of key -> JsValue from obj
    val mapObj = Json.toJson(x).transform(moveKeys(objToQueryStringMapping)).get.value

    // Convert the JsValue values of the map to query strings
    mapObj.mapValues(jsValueToQueryStringValue).filter(_._2.nonEmpty).toMap
  }
}

现在,对于要序列化的类,您根本不需要extends ...