函数返回通用数组

时间:2016-04-28 10:36:02

标签: scala

我有一个关于将Array[Byte]转换为Array[T]的函数的问题。有问题的功能:

def getPoints[T](bytes : Array[Byte]) : Array[T] = {
      val byteBuffer = ByteBuffer.wrap(bytes)
      byteBuffer.order(ByteOrder.LITTLE_ENDIAN)
      val data = Array.ofDim[T](bytes.length / biosRecord.byteEncoding)
      if(biosRecord.byteEncoding == 2) {
        byteBuffer.asShortBuffer.get(data)
        data
      } else if(biosRecord.byteEncoding == 4) {
        byteBuffer.asIntBuffer().get(data)
        data
      } else null
    }

biosRecord是一个带有int字段(byteEncoding)的案例类。

我知道此代码中存在两个问题:

  1. 要返回通用数组,我需要使用Manifest
  2. 在第一个if分支中,推断类型为Array[Short],第二个类型为Array[Int]。这就是为什么我尝试使用泛型类型T,但它不起作用。
  3. 我在编译时得到的结果:

    [error]   (x$1: Array[Short])java.nio.ShortBuffer <and>
    [error]   (x$1: Int)Short
    [error]  cannot be applied to (Array[T])
    [error]         byteBuffer.asShortBuffer.get(data)
    
    [error]   (x$1: Array[Int])java.nio.IntBuffer <and>
    [error]   (x$1: Int)Int
    [error]  cannot be applied to (Array[T])
    [error]         byteBuffer.asIntBuffer().get(data)
    

    为了使这个通用函数编译,我需要做什么?

1 个答案:

答案 0 :(得分:4)

签名def getPoints[T](bytes : Array[Byte]) : Array[T]表示来电者可以决定T是什么。例如,通过调用:

val myResult = getPoints[String](myBytes)

我让getPoints返回Array[String],无论的值是myBytes

换句话说 - 您尝试做的事情是不可能的。您无法根据&#34;决策&#34;参数化方法的类型。在方法 body

也许你想要做的是使用最常见类型,它是所有可能返回类型的超类。在这种情况下:

def getPoints(bytes : Array[Byte]) : Array[AnyVal] = {
    // can return Array[Int], Array[Short]...
}

这样,调用者无法强制输入类型,并且不知道类型,他们只知道它是{的子类之一{1}}。