我有一个关于将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
)的案例类。
我知道此代码中存在两个问题:
Manifest
。 if
分支中,推断类型为Array[Short]
,第二个类型为Array[Int]
。这就是为什么我尝试使用泛型类型T
,但它不起作用。我在编译时得到的结果:
[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)
为了使这个通用函数编译,我需要做什么?
答案 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}}。