使用`_`定义java.util.Set的读取

时间:2014-02-11 17:32:18

标签: java scala playframework

使用Play Framework的JSON库,我正在尝试为Reads[Obj]定义:

Obj.java

public class Obj {
  private Long id;
  private String description;
  private Set<Group> groups;

  public Obj(Long id, String description, Set<Group> groups) { 
    // set fields 
  }
}

但是,当我使用_.asJava时,我得到missing parameter type编译时错误。

import play.api.libs.json._
import play.api.libs.functional.syntax._
import scala.collection.JavaConverters._

      implicit val ObjReads: Reads[Obj] = (
          (JsPath \ "id").read[Long] and
          (JsPath \ "description").read[String] and
          (JsPath \ "groups").read[Set[Group]] and
        )(new Obj(_,_,_.asJava))

请注意,我需要致电asJavascala.collection.immutable.Set转换为java.util.Set

如果没有命名每个参数及其类型,我怎样才能在第三个元素上简洁地调用asJava

1 个答案:

答案 0 :(得分:1)

你不能总是只使用下划线而不是名字,因为编译器并不总是知道你想如何解决它们。

def f(a: String, b: String) = f"$a~$b"

Vector(1,2,3).foldLeft("0")(f(_, _.toString))           // ERROR
Vector(1,2,3).foldLeft("0")((z,x) => f(z, x.toString))  // fine

只需为参数命名即可轻松修复它。