如何将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[]
,但这并没有解决问题。必须存在一些转换?
正如其他人指出的,转换没有问题。我的IDE表现错误,并显示没有问题编译的虚构错误。这时接收方法在主方法在下面的代码中调用标有错误:
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]);
}
}
斯卡拉:
package stackOverflow
import stackOverflow._
class ScalaByteReceiver{
def receive(bytes: Array[Byte]) {
println(bytes.length);
// prints 4
}
}
所以Java和Scala很好地相互理解。
我试图重现您的错误,但它按预期运行。 使用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 2011-06-04 18:08:16
你在用什么IDE? Intellij没有问题。 – sourcedelica 2011-06-04 16:06:31
你使用2.8或更高版本? 'Array [Byte]'_is_'byte []'从2.8开始,所以如果你的IDE抱怨你的IDE是错误的。 – 2011-06-04 16:17:51
我正在使用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