使用容器时将scala字节转换为java字节

时间:2018-06-15 14:01:39

标签: java scala interop

我需要调用java api,它适用于字节序列

public class JBytes {
    public static void single(Byte b) {
    }

    public static void array(byte[] arr) {
    }

    public static void iterable(Iterable<Byte> it) {
    }
}
来自scala的

import scala.collection.JavaConverters._

class SBytes {

  val b: Byte = ???

  val arr: Array[Byte] = ???

  val iter: Iterable[Byte] = ???

  JBytes.single(b)

  JBytes.array(arr)

  JBytes.iterable(iter.asJava) // Compiler fails with found: Iterable[scala.Byte] required: Iterable[java.lang.Byte]

  JBytes.iterable(iter.map(_.asInstanceOf[java.lang.Byte]).asJava) // works
}

我可以不使用instanceOf [java.lang.Byte]吗?

1 个答案:

答案 0 :(得分:3)

使用valueOf

java.lang.Byte方法

另一种是简单地声明类型注释

scala> val a: Byte = 1
a: Byte = 1

scala> val b: java.lang.Byte = a
b: Byte = 1

scala> b.getClass
res6: Class[_ <: Byte] = class java.lang.Byte

b现在是java.lang.Byte

Scala REPL

scala> :paste
// Entering paste mode (ctrl-D to finish)

implicit class ByteOps(v: Byte) {
  def toJavaByte: java.lang.Byte = java.lang.Byte.valueOf(v.toString)
}

// Exiting paste mode, now interpreting.

defined class ByteOps

scala> val a: Byte = 1
a: Byte = 1

scala> a.toJavaByte
res4: Byte = 1