2011-06-13 13 views
5

Necesito una biblioteca de compilador a la que se pueda llamar desde Scala y Java. Lo suficientemente fácil en Scala usando los parámetros nombrados por defecto. Pero, ¿cómo puedo llamar a este código desde Java? Vea abajo. ¿O tal vez debería usar una API fluida que sea más común en ambos idiomas?Biblioteca de compilación para Scala y Java

Scala:

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 
    ) 
    } 

Uso:

val p1 = PersonBob().build 
val p2 = PersonBob(lastName = "Jones").build 

Java Uso:

Person p1 = ? 
Person p2 = ? 

Respuesta

3

los argumentos por defecto no son interoperables entre Scala y Java, como se menciona en el último comunicado de http://www.scala-lang.org/node/2075.

para determinar cómo usar el código anterior de java, quizás javap puede ayudar. tomemos un ejemplo más pequeño que el que ha publicado. por ejemplo

case class PersonBob(a: String = "aa", b: String = null) 

compilar esta usando scalac y, a continuación, ejecutar javap en el archivo de clase producida (sin la extensión .class), obtenemos

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); 
} 

podemos ver que el único constructor que tenemos es

public PersonBob(java.lang.String, java.lang.String); 

por lo que en su caso, el código java sería algo como

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

suponiendo que la clase GenderBob no tiene parámetros en su constructor. en cuanto a la fluidez de esto en Java, supongo que en última instancia es una cuestión de gusto, pero en mi humilde opinión, creo que la versión de Java podría ser menos detallada para un constructor

+0

Tenga en cuenta que he creado una pregunta similar pero separada con respecto al constructor de tipo seguro. Ver [http://stackoverflow.com/questions/6347083/type-safe-buider-library-for-scala-and-java](http://stackoverflow.com/questions/6347083/type-safe-buider-library -for-scala-and-java) – eptx

Cuestiones relacionadas