2011-06-01 11 views
11

¿Hay un método implícito para convertir scala.collection.mutable.StringBuilder en java.lang.StringBuilder?Scala StringBuilder

Estoy usando una biblioteca Java (JCommander) en la que uno de los métodos (usage) toma un argumento java.jang.StringBuilder.

Respuesta

9

No puede iniciar con un Scala StringBuilder y luego obtener la versión de Java. Sin embargo, puede ajustar un java.lang.StringBuilder en la versión de Scala. Por lo tanto:

val jsb = new java.lang.StringBuilder(); 
val sb = new StringBuilder(jsb); 
// Do Scala-y stuff with sb 
JCommander.whatever.usage(jsb); 
// Do more Scala-y stuff 

Desde - no es una garantía, pero cierto en la práctica en este momento (2.8, 2.9) - el envoltorio Scala no almacena ningún estado (en su lugar sólo en referencia a la versión Java), que' Es seguro mezclar y combinar el uso de los dos.

1

Uso transformar esta implícita hacer hacer esto:

implicit def b2b(b: scala.collection.mutable.StringBuilder) = 
     new java.lang.StringBuilder(b) 
+1

En realidad, no creo que funcione. Supongo que cualquier método de Java que espere un 'java.lang.StringBuilder' espera modificarlo y permitir que la persona que llama tenga acceso a esos cambios. El método "implícito" que muestra crea una copia "defensiva" de 'scala.collection.mutable.StringBuilder'. Cualquier cambio en el método llamado ** no ** se reflejará en 'scala.collection.mutable.StringBuilder'. Ahora que lo pienso, la única forma en que podría implementarse es si 'scala.collection.mutable.StringBuilder' se extendió o envolvió' java.lang.StringBuilder'. – Ralph

4

Mirando el código fuente, parece que no hay absolutamente ninguna manera de conseguir un java.lang.StringBuilder de un scala.collection.mutable.StringBuilder.

Puede crear un nuevo java.lang.StringBuilder con Scala, pasando por una conversión de algún tipo (String o CharSequence).