2016-03-30 13 views
0

Ich versuche, mit einer generischen Funktion (toBitSet) unter Verwendung von Typ-Parameter T.Typ Parameter Ausgabe in Scala mit generischer Funktion

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 und shortToBitSet Funktionen der generischen Funktion specializaton werden zu kommen.

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) 
    } 

jedoch Scala versteht nicht die Operatoren (>>, &, ==, +) auf Typen T eine Fehlermeldung zu zeigen. Ich habe angegeben, dass T Integral-Typ ist, aber es funktioniert nicht.

enter image description here

Wie dieses Problem zu lösen?

+1

Mit einer solchen Deklaration führen Sie einen impliziten Parameter für Ihre Methode vom Typ 'Integral [T]' ein. Scalas Analogon für '' ist '[T <: SomeType]' – Aliaxander

Antwort

3

Die Art Signatur def func[T: Integral](arg: T) = {} für tatsächlich eine syntaktische Kurz ist: (. „Ev“ oft als Name für diese „Beweise“ Argument gewählt wird) def func[T](arg: T)(implicit ev: Integral[T]) = {}

Die Integral trait umreißt, welche Operationen Sie dann auf verwenden Elemente des Typs T. Beispiel: Zusätzlich ist ev.plus(t1, t2)

Wenn Sie import Integral.Implicits._ dann können Sie die natürliche Infixschreibweise verwenden: t1 + t2

Leider ist das Integral Merkmal nicht bitweise Operationen wie & und >> umfassen.

Wenn Sie Ihren Algorithmus ändern können, um nur die verfügbaren Ops zu verwenden, erhalten Sie die Funktion, nach der Sie suchen.