2011-06-04 21 views
9

Soy nuevo en Scala y trabajo actualmente en un proyecto que involucra tanto módulos de Java como de Scala. Ahora me gustaría llamar a un método Scala de Java utilizando un parámetro de tipo byte [].¿Cómo convierto una matriz de bytes Java en una matriz de bytes Scala?

El método Scala tiene la firma: def foo(data: Array[Byte])

La llamada de Java es el siguiente: foo(x), donde x tiene el tipo byte[].

El IDE me dice que no es posible:

The method foo(Array) in the type Bar is not applicable for the arguments (byte[]) 

Como una restricción adicional no se prefiere cambiar el método de Scala. Del lado de Java intenté usar Byte[], pero esto no resolvió el problema. Debe existir alguna conversión?

+0

¿Qué IDE estás usando? Intellij no tiene ningún problema con eso. – sourcedelica

+0

¿Estás usando 2.8 o posterior? 'Array [Byte]' _is_ 'byte []' a partir de 2.8, por lo que si su IDE se queja de que su IDE está equivocado. –

+0

Estoy usando Eclipse Helios 3.6.2 con Scala IDE instalado para Eclipse 2.0.0-beta4. El proyecto está organizado en módulos Maven, donde tanto Scala como el módulo Java incluyen scala-library-2.9.0 como dependencia Maven. Me he dado cuenta de que Scala IDE está haciendo cosas raras a veces, como mostrar advertencias imaginarias y errores en el explorador de paquetes, pero generalmente la limpieza y la reconstrucción del proyecto son útiles (lo cual ya probé en este caso). – mtsz

Respuesta

4

Como han señalado otros, no hay ningún problema en la conversión. Mi IDE se comporta de forma errónea y muestra errores imaginarios que se compilan sin problemas. En este momento la llamada del método de recibir en el principal método en el siguiente código está marcado con el error:

The method receive(Array) from the type ScalaByteReceiver refers to the missing type Array

Pero este código, que es un ejemplo de mi pregunta, compila bien y se obtiene el resultado esperado:

Java:

package stackOverflow; 

public class JavaByteSender {  
    public static void main(String... args) { 
    new ScalaByteReceiver().receive(new byte[4]); 
    } 
} 

Scala:

package stackOverflow 

import stackOverflow._ 

class ScalaByteReceiver{ 

    def receive(bytes: Array[Byte]) {  
    println(bytes.length); 
    // prints 4 
    } 
} 

Así que Java y Scala se entienden muy bien.

1

He intentado reproducir su error pero se ejecutó como se esperaba. Correr con Scala 2.9.0 y SBT

código de Java: Código

package stackOverflow; 

public class ByteContainer { 

    private byte[] bytes; 

    public ByteContainer(byte[] bytes){ 
     this.bytes = bytes; 
    } 

    public byte[] getBytes() { 
     return bytes; 
    } 

    public void setBytes(byte[] bytes) { 
     this.bytes = bytes; 
    } 

} 

Scala:

package stackOverflow 

import stackOverflow._ 

class ScalaByte{ 
    val bytes:Array[Byte] = "this is my test".getBytes() 
} 

object ByteUser extends App{ 
    val b = new ByteContainer((new ScalaByte()).bytes) 
    val s = b.getBytes() 
    println(s) 
} 

de salida: [B @ 6ef38f6f

Esto compila y se ejecuta. ¿No es esto lo que preguntabas? no dude en comentar

+0

"¿No es esto por lo que preguntabas?" - Casi :) ...pasas Scala 'Array [Byte]' a un método Java (constructor) que espera 'byte []', y yo estaba buscando la solución en la otra dirección. Pero demostraste con éxito que esto funciona bien también. Estoy convencido de que mi IDE se está comportando de manera errónea, de hecho, parece que no hay ningún problema con la conversión. Implementé un ejemplo de trabajo que publicaré en un segundo, que está marcado con errores pero compila y arroja resultados esperados. Pero gracias por su código, me tomé la libertad de usarlo como base para el ejemplo de trabajo. – mtsz

Cuestiones relacionadas