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

问题描述:

我是Scala的新手,目前在一个涉及Java和Scala模块的项目上工作。现在我想使用byte []类型的参数从Java调用Scala方法。如何将Java字节数组转换为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[],但这并没有解决问题。必须存在一些转换?

+0

你在用什么IDE? Intellij没有问题。 – sourcedelica 2011-06-04 16:06:31

+0

你使用2.8或更高版本? 'Array [Byte]'_is_'byte []'从2.8开始,所以如果你的IDE抱怨你的IDE是错误的。 – 2011-06-04 16:17:51

+0

我正在使用Eclipse Helios 3.6.2并安装了用于Eclipse 2.0.0-beta4的Scala IDE。该项目是在Maven模块中组织的,其中Scala和Java模块都包含scala-library-2.9.0作为Maven依赖项。我注意到Scala IDE有时会做一些奇怪的事情 - 比如在包资源管理器中显示想象中的警告和错误,但通常清理和重建项目会有所帮助(我已经尝试过这种情况)。 – mtsz 2011-06-04 16:27:43

正如其他人指出的,转换没有问题。我的IDE表现错误,并显示没有问题编译的虚构错误。这时接收方法在主方法在下面的代码中调用标有错误:

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

但这个代码,它体现了我的问题,编译罚款,并产生预期的结果:

的Java:

package *; 

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

斯卡拉:

package * 

import *._ 

class ScalaByteReceiver{ 

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

所以Java和Scala很好地相互理解。

我试图重现您的错误,但它按预期运行。 使用Scala 2.9.0和SBT

java代码运行:

package *; 

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 * 

import *._ 

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

此编译和运行。这不是你问的吗?随时发表评论。

+0

“这不是你问的问题吗?” - 差不多:) ...你将Scala'Array [Byte]'传递给期望'byte []'的Java(构造函数)方法,并且我正在寻找另一个方向的解决方案。但是你成功展示了这个工作正常。我确信我的IDE行为错误,实际上转换似乎没有问题。我实施了一个工作示例,我将在第二个帖子中发帖,该帖子标记有错误,但会编译并产生预期结果。但是,感谢您的代码,我冒昧地将其用作工作示例的基础。 – mtsz 2011-06-04 18:08:16