如何将Java字节数组转换为Scala字节数组?

10

我是Scala的新手,目前正在一个涉及Java和Scala模块的项目中工作。现在我想使用类型为byte[]的参数从Java调用Scala方法。

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[],但这并没有解决问题。必须存在某种转换吗?


你在用什么集成开发环境(IDE)?Intellij对此没有问题。 - sourcedelica
你正在使用2.8或更高版本吗?Array [Byte] 从2.8开始就是 byte [],如果你的IDE报错了,那么你的IDE是错误的。 - Rex Kerr
我正在使用安装了Scala IDE for Eclipse 2.0.0-beta4的Eclipse Helios 3.6.2。该项目是以Maven模块组织的,其中Scala和Java模块都包括scala-library-2.9.0作为Maven依赖项。我注意到Scala IDE有时会做一些奇怪的事情 - 比如在包资源管理器中显示虚假的警告和错误,但通常清理和重建项目可以解决问题(我已经尝试过了)。 - mtsz
1
嗯,这很有趣:在Java中使用类型为(原始)scala.Array的x调用foo(x)会让我的IDE返回:The method foo(byte[]) in the type Bar is not applicable for the arguments (Array)。这就是我所说的矛盾行为。我应该尝试在其他地方编译代码... - mtsz
2个回答

5

正如其他人指出的那样,转换没有问题。我的IDE表现错误,并显示虚假的错误,但实际上这些代码是可以编译通过的。此时,在以下代码中的主方法中调用receive方法被标记为错误:

来自ScalaByteReceiver类型的receive(Array)方法引用了缺失的类型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

我尝试重现您的错误,但它按预期运行。 使用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;
    }

}

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

输出:[B@6ef38f6f

这个可以编译和运行。这不是你想问的吗?欢迎评论。


这不是你所询问的内容吗?几乎 :) ... 你将Scala Array[Byte]传递给一个期望byte[]的Java(构造函数)方法,而我正在寻找另一种解决方案。但是你成功地展示了这也可以正常工作。我相信我的IDE出现了错误,实际上转换没有问题。我实现了一个可行的示例,稍后会发布,它被标记为有错误但编译并产生了预期的结果。但是感谢您的代码,我有权将其用作工作示例的基础。 - mtsz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接