Как преобразовать байтовый массив Java в байтовый массив Scala? - PullRequest
9 голосов
/ 04 июня 2011

Я новичок в Scala и в настоящее время работаю над проектом, включающим модули Java и Scala. Теперь я хотел бы вызвать метод Scala из Java, используя параметр типа byte [].

Метод Scala имеет подпись: def foo(data: Array[Byte])

Вызов Java выглядит следующим образом: foo(x), где x имеет тип byte[].

IDE говорит мне, что это невозможно:

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

В качестве дополнительного ограничения не рекомендуется изменять метод Scala. На стороне Java я пытался использовать Byte[], но это не решило проблему. Там должно быть какое-то преобразование?

Ответы [ 2 ]

4 голосов
/ 05 июня 2011

Как отмечали другие, в конвертации проблем нет. Моя IDE ведет себя ошибочно и показывает мнимые ошибки, которые компилируются без проблем. В этот момент вызов метода получения в main-методе в следующем коде отмечен ошибкой:

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

Но этот код, который иллюстрирует мой вопрос, прекрасно компилируется и дает ожидаемый результат:

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

Так что Java и Scala прекрасно понимают друг друга.

1 голос
/ 04 июня 2011

Я попытался воспроизвести вашу ошибку, но она запустилась, как и ожидалось. Бег с scala 2.9.0 и sbt

код Java:

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

}

скала код:

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

вывод: [B @ 6ef38f6f

Это компилируется и запускается. Разве это не то, о чем вы спрашивали? не стесняйтесь комментировать.

...