【问题标题】:How do I convert a Java byte array into a Scala byte array?如何将 Java 字节数组转换为 Scala 字节数组?
【发布时间】:2011-06-04 15:37:00
【问题描述】:

我是 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 对此没有任何问题。
  • 您使用的是 2.8 或更高版本吗? Array[Byte] byte[] 从 2.8 开始,所以如果你的 IDE 抱怨你的 IDE 是错误的。
  • 我正在使用 Eclipse Helios 3.6.2 和安装的 Scala IDE for Eclipse 2.0.0-beta4。该项目以 Maven 模块组织,其中 Scala 和 Java 模块都包含 scala-library-2.9.0 作为 Maven 依赖项。我注意到 Scala IDE 有时会做一些奇怪的事情——比如在包资源管理器中显示虚构的警告和错误,但通常清理和重建项目会有所帮助(我已经在这种情况下尝试过)。
  • 嗯,这很有趣:使用 x 类型(原始)scala.Array 从 Java 调用 foo(x) 让我的 IDE 返回:The method foo(byte[]) in the type Bar is not applicable for the arguments (Array)。这就是我所说的矛盾行为。我应该尝试在其他地方编译代码...

标签: java scala bytearray


【解决方案1】:

正如其他人指出的那样,转换没有问题。我的 IDE 出现错误,并显示编译时没有问题的虚构错误。此时下面代码中main-method中receive方法的调用被标记为错误:

ScalaByteReceiver 类型的方法receive(Array) 引用了缺失的类型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 可以很好地相互理解。

【讨论】:

    【解决方案2】:

    我试图重现您的错误,但它按预期运行。 使用 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 行为错误,实际上转换似乎没有问题。我实现了一个工作示例,稍后我将发布该示例,该示例标有错误,但可以编译并产生预期结果。但是感谢您的代码,我冒昧地将它用作工作示例的基础。
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2015-12-27
    • 2022-01-23
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多