ept*_*ptx 5 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+","+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
)
}
Run Code Online (Sandbox Code Playgroud)
用法:
val p1 = PersonBob().build
val p2 = PersonBob(lastName = "Jones").build
Run Code Online (Sandbox Code Playgroud)
Java用法:
Person p1 = ?
Person p2 = ?
Run Code Online (Sandbox Code Playgroud)
小智 3
默认参数在 scala 和 java 之间不可互操作,如http://www.scala-lang.org/node/2075的最后一条语句中所述。
要确定如何使用 java 中的上述代码,也许 javap 可以提供帮助。让我们举一个比您发布的更小的例子。例如
case class PersonBob(a: String = "aa", b: String = null)
Run Code Online (Sandbox Code Playgroud)
使用 scalac 编译它,然后在生成的类文件(不带 .class 扩展名)上运行 javap,我们得到
public class PersonBob extends java.lang.Object implements scala.ScalaObject,scala.Product,scala.Serializable {
public static final java.lang.String apply$default$2();
public static final java.lang.String apply$default$1();
public static final java.lang.String init$default$2();
public static final java.lang.String init$default$1();
public static final scala.Function1 tupled();
public static final scala.Function1 curry();
public static final scala.Function1 curried();
public scala.collection.Iterator productIterator();
public scala.collection.Iterator productElements();
public java.lang.String a();
public java.lang.String b();
public PersonBob copy(java.lang.String, java.lang.String);
public java.lang.String copy$default$2();
public java.lang.String copy$default$1();
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public java.lang.String productPrefix();
public int productArity();
public java.lang.Object productElement(int);
public boolean canEqual(java.lang.Object);
public PersonBob(java.lang.String, java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到我们唯一的构造函数是
public PersonBob(java.lang.String, java.lang.String);
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下,你的java代码看起来像
Person p1 = new PersonBob(new GenderBob().build(), null, null)
Person p2 = new PersonBob(new GenderBob().build(), null, "Jones")
Run Code Online (Sandbox Code Playgroud)
假设 GenderBob 类在其构造函数中不带任何参数。至于它在 Java 中的流畅程度,我认为最终这是一个品味问题,但以我的愚见,我认为 Java 版本对于构建者来说可能不那么冗长
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |