2016-04-28 10 views
1

Array[Byte]Array[T]への変換について書いた関数には1つの問題があります。問題の機能:汎用配列を返す関数

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)の場合クラスです。私はこのコードに2つの問題がある知っている

  1. 一般的な配列を返すためには、私がManifestを使用する必要があります。
  2. 最初のifブランチでは、推定されるタイプはArray[Short]であり、2番目のタイプは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

2つの問題があります: 'byteBuffer.asShortBuffer.get(data)'ここでgetはintまたは 'Array [Short]'を取りますが、配列は汎用で、2番目の 'ofDim'は' T 'である。 –

答えて

4

署名def getPoints[T](bytes : Array[Byte]) : Array[T]は、発信者が何を決定できるかを示します。Tです。たとえば、呼び出すことにより:

val myResult = getPoints[String](myBytes) 

私は関係なく、myBytesの値のArray[String]を返すgetPoints作ってるんです。

つまり、 - あなたがしようとしていることはできません。メソッド内の "決定"に基づいてメソッドのタイプをパラメータ化することはできません。

多分あなたがここでやりたいことは、可能なすべての返品タイプのスーパークラスであるのベストコモンタイプです。この場合:

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

この方法では、呼び出し側が型を強制することはできません、とに種類を知らないん、彼らは知っているすべては、それがAnyValのサブクラスの一つだということです。

+0

このエラーを理解し、修正するために、私はADTを使用します。説明ありがとうございます – alifirat