2016-03-30 10 views
0

使用して型パラメータT.タイプの一般的な機能を備えたScalaではパラメーター問題

def toBitSet[T:Integral](x:T, valueBitwidth:Int, filterBitwidth:Int, bigEndian:Boolean = true, shift:Int = 0) = { 
    BitSet((for (i <- 0 to (valueBitwidth - 1) if (((x & 0xFF) >> i) & 1) == 1) yield (i + shift)): _*) 
    } 

byteToBitSetとshortToBitSet機能は、一般的な機能のspecializatonです。

def byteToBitSet(x:Byte, filterBitwidth:Int, bigEndian:Boolean = true, shift:Int = 0) = { 
    toBitSet[Byte](x = x, valueBitwidth = 8, filterBitwidth = filterBitwidth, bigEndian = bigEndian, shift = shift) 
    } 
    def shortToBitSet(x:Short, filterBitwidth:Int, bigEndian:Boolean = true, shift:Int = 0) = { 
    toBitSet[Short](x = x, valueBitwidth = 16, filterBitwidth = filterBitwidth, bigEndian = bigEndian, shift = shift) 
    } 

しかし、Scalaは、エラーメッセージを表示するタイプのTに(>>、&、==、+)演算子を理解していません。私はTがIntegral型であると指定しましたが、動作しません。この問題を解決する方法

enter image description here

+1

このような宣言では、Integral [T]型のメソッドに暗黙のパラメータを導入します。 Scalaの ' 'の類推は' [T <:SomeType] 'です – Aliaxander

答えて

3

型シグネチャ def func[T: Integral](arg: T) = {} が実際のシンタックス速記です: def func[T](arg: T)(implicit ev: Integral[T]) = {}(「EV」が、多くの場合、この「証拠」引数の名前として選択されます。)

Integral traitは、あなたが、その後に使用するものの操作概説タイプTの要素例:残念ながらt1 + t2

、インテグラ形質は&>>のようなビット単位の演算が含まれていません。また、あなたがimport Integral.Implicits._、あなたがより自然な中置記法を使用することができる場合ev.plus(t1, t2)

です。

利用可能なオプションのみを使用するようにアルゴリズムを変更することができます。

関連する問題