使用scala中的替代项重载方法值ofDim

时间:2018-03-02 14:39:43

标签: java arrays scala

def accessRecord(filePath: String, recordSize: Long, offset: Long): Int = {
     val fs = FileSystem.get(SparkHadoopUtil.get.conf)
     val stream = fs.open(new Path(filePath))
     val bytes = Array.ofDim[Byte](recordSize)
     stream.readFully(offset, bytes)
     stream.close()
     bytes.length
     }

在上面的代码中,recordSize变量作为参数传递,该参数从下面的函数之一接收值,数据类型为Long。所以它给出的错误是

error: overloaded method value ofDim with alternatives:
  (n1: Int,n2: Int,n3: Int,n4: Int,n5: Int)(implicit evidence$7: scala.reflect.ClassTag[Byte])Array[Array[Array[Array[Array[Byte]]]]] <and>
  (n1: Int,n2: Int,n3: Int,n4: Int)(implicit evidence$6: scala.reflect.ClassTag[Byte])Array[Array[Array[Array[Byte]]]] <and>
  (n1: Int,n2: Int,n3: Int)(implicit evidence$5: scala.reflect.ClassTag[Byte])Array[Array[Array[Byte]]] <and>
  (n1: Int,n2: Int)(implicit evidence$4: scala.reflect.ClassTag[Byte])Array[Array[Byte]] <and>
  (n1: Int)(implicit evidence$3: scala.reflect.ClassTag[Byte])Array[Byte]
 cannot be applied to (Long)
           val bytes = Array.ofDim[Byte](recordSize)
                                  ^ 

有人可以告诉我为什么我会遇到这个错误? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

数组的最大长度由数组的固定整数长度控制。这就是ofDim获取Int个参数的原因,但是您在Long中传递recordSize(这是错误的来源和含义)。要解决此问题,您可以拨打Long.toInt

val bytes = Array.ofDim[Byte](recordSize.toInt)

或将recordSize更改为Int

答案 1 :(得分:1)

因为Array.ofDim[A](size: Int)不期望Long

通常,JVM上的数组总是被32位整数索引,并且它可能不会发生变化,因为它现在不可能用{{.length替换返回类型Long 1}}不破坏一切。