2010-02-27 13 views

Respuesta

28

Asumo que por "objeto" se realmente significa "clase". En cualquier caso, la respuesta es sí, puedes hacer esto. Tendrá que aprovechar el compilador conjunto de Scala/Java si quiere esto en el mismo proyecto. Por ejemplo:

public interface Parser { 
    public TokenIterator parse(InputStream is); 
} 

Luego, en Scala:

class ParserImpl extends Parser { 
    def parse(is: InputStream) = ... 
} 

Por último, en Java nuevo:

public class Consumer { 
    public static void main(String[] args) { 
     Parser p = new ParserImpl();  // just like a Java class! 
     ... 
    } 
} 

Si todos estos archivos de origen se encuentran en el mismo proyecto, entonces usted tendrá que para compilarlos usando la siguiente invocación de comandos:

$ scalac *.scala *.java 
$ javac -classpath . *.java 

El primer comando invoca el compilador conjunto de Scala/Java, que compilará las fuentes de Scala y las fuentes Java suficientes para satisfacer las dependencias. El segundo comando invoca el compilador de Java con las clases de Scala compiladas recientemente en el classpath.

1

Sí, es posible. Algunas de las características de Scala (como los objetos singleton) compilarán código que es difícil de usar desde Java, pero el uso de clases de Scala a través de una interfaz Java es una manera fácil de escribir código compatible.

Algunas preguntas sobre la interoperabilidad de Java se responden en http://www.scala-lang.org/faq/4 y en el libro Programming in Scala. Citado de esa pregunta frecuente:

¿Puedo utilizar el código Java existente de Scala?

Acceder a las clases de Java desde el código de Scala no es problema en absoluto. Usar una clase Scala de Java puede ser complicado, en particular si su clase de Scala usa funciones avanzadas como genéricos, métodos polimórficos o tipos abstractos. Como Java no tiene estas características de idioma, debe saber algo sobre el esquema de codificación de las clases de Scala. De lo contrario, no debería haber problemas.

¿Necesito convertir estructuras de datos de Java a Scala, y viceversa?

No necesita convertir estructuras de datos Java para utilizarlas en Scala. Puedes usarlos "tal como están". Por ejemplo, las clases Scala pueden subclasificar clases de Java, puede crear instancias de clases de Java en Scala, se puede acceder a los métodos, campos (incluso si son estáticos), etc.

3

He implementado un org.apache.solr.handler.RequestHandlerBase personalizado y personalizado org.apache.solr.request.QueryResponseWriter en Scala 2.8 con Java 1.6.0 y Solr 1.4.0.No estoy seguro de la versión de Lucene que está usando Solr 1.4.0 pero supongo que es bastante reciente. De todos modos, empaqué los archivos de clase generados por Scala en un contenedor y Solr pudo cargarlo muy bien. Entonces, lo que estás tratando de hacer es posible.

Yo diría que lo principal a superar es convertir objetos de colección de Java como List y Vector en objetos de colección Scala y viceversa. scala.collection.JavaConversions en Scala 2.8.0 probablemente sea tu amigo.

Otra cosa, si es necesario reemplazar un método como getBooleanQuery, puede ser necesario añadir [_] hacer Scala compile (código no probado - pero ya que me tomó un tiempo para averiguar ese tipo de cosas cuando empecé Scala, pensé que me gustaría compartir):

override def getBooleanQuery(clauses: java.util.List[_]): Query = { ... } 

Editar:: Una cosa más sobre la compilación conjunta. La información de Daniel sobre cómo compilar en conjunto es útil. No obstante, puede que no lo necesite de inmediato, como muy probablemente, solo necesita tener scalac conocer la ruta a los archivos jar Lucene, luego empaquetar su clase en un nuevo jar, y tener su archivo jar utilizado en tiempo de ejecución en el entorno desplegado.

Cuestiones relacionadas