Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala和Java的生成器库_Java_Scala_Scala Java Interop - Fatal编程技术网

Scala和Java的生成器库

Scala和Java的生成器库,java,scala,scala-java-interop,Java,Scala,Scala Java Interop,我需要一个可以从Scala和Java调用的生成器库。在Scala中使用默认的命名参数非常简单。但是我如何从Java中调用这段代码呢?见下文。或者我应该使用两种语言都更通用的流畅API 斯卡拉: case class Person(gender:Gender.Value, firstName:String, lastName:String){ def fullName = lastName+", "+firstName override def toString = firstName+"

我需要一个可以从Scala和Java调用的生成器库。在Scala中使用默认的命名参数非常简单。但是我如何从Java中调用这段代码呢?见下文。或者我应该使用两种语言都更通用的流畅API

斯卡拉:

case class Person(gender:Gender.Value, firstName:String, lastName:String){
  def fullName = lastName+", "+firstName
  override def toString = firstName+","+lastName+","+gender
}
case class PersonBob(
  gender:Gender = GenderBob().build,
  firstName:String =  null,
  lastName:String = null) {
  def build = Person(
    gender,
    if(firstName == null) NameBob(if(gender==Gender.Male) engMaleNames 
      else engFemaleNames).build else firstName,
    if(lastName==null) NameBob(engLastNames).build 
      else lastName
    )
  }
用法:

val p1 = PersonBob().build
val p2 = PersonBob(lastName = "Jones").build
Java用法:

Person p1 = ?
Person p2 = ?

默认参数在scala和java之间不可互操作,如中最后一条语句所述

要确定如何从java使用上述代码,javap可能会有所帮助。让我们举一个比你所发表的小的例子。比如说

case class PersonBob(a: String = "aa", b: String = null)
使用scalac编译,然后在生成的类文件上运行javap(不带.class扩展名),我们得到

我们可以看到我们唯一的构造函数是

public PersonBob(java.lang.String, java.lang.String);
因此,在您的例子中,您的java代码看起来像

Person p1 = new PersonBob(new GenderBob().build(), null, null)
Person p2 = new PersonBob(new GenderBob().build(), null, "Jones")

假设GenderBob类在其构造函数中不接受任何参数。至于Java的流利程度,我想这最终是一个品味的问题,但在我的拙见中,我认为Java版本对于一个构建器来说可能不那么冗长

注意,我已经创建了一个关于类型安全构建器的类似但独立的问题。看见
Person p1 = new PersonBob(new GenderBob().build(), null, null)
Person p2 = new PersonBob(new GenderBob().build(), null, "Jones")