2017-04-20 2 views
1

Ich bin neu in Scala. Ich habe eine Funktion:Scala: Generischer ganzzahliger Rückgabetyp?

def fromBinaryListBig(in: Array[Int]): BigInt = { 
    var sum = 0 
    in foreach (x => {sum <<= 1; sum += (x&1)}) 
    sum 
} 

Ist es möglich, den Rückgabetyp Generika (Integer-Typen, Lang, Int) zu machen? Vielen Dank im Voraus ...

Antwort

2

Sie können eine generische Rückgabetyp haben, wenn es einen allgemeinen Parameter übereinstimmt ...

def fromBinaryListBig[N:Numeric](in: Array[N]): N = in.sum 

... aber man kann nicht anders (Generika) return Typen basieren auf einer internen Bedingung (wie zum Beispiel der Wert einer akkumulierten Summe).

+0

Thx für die Antwort. Ist es möglich, "Summe" auch generisch zu machen? Ich möchte vermeiden, den gleichen Code immer wieder zu kopieren, aber nur den Rückgabetyp ändern. – paul

+0

@paul Numeric hat eine Summenfunktion –

+0

@paul, ich habe das Beispiel geändert, um die Summe eines 'Array' eines beliebigen numerischen Typs zurückzugeben. Der Rückgabetyp entspricht dem Typ "Array". Wenn der Summenwert wahrscheinlich den Eingabetyp überläuft, müssen Sie einen anderen Ansatz wählen. – jwvh

0

Technisch gesehen, ja, es ist durchaus möglich:

def fromBinaryListBig[A](in: Array[Int])(implicit ev: Integral[A]): A = { 
    var sum = ev.zero 
    val two = ev.fromInt(2) 
    in foreach (x => {sum *= two; sum += ev.fromInt(x&1)}) 
    sum 
} 

Dies bedeutet, dass der Anrufer den Rückgabetyp bestimmt, so können sie schreiben z.B.

val x = fromBinaryListBig[Byte](Array(0, 1, 0, 1, 0, 0, 0)) 

oder geben Sie den erwarteten Typ

val x: BigInt = fromBinaryListBig(...) 
Verwandte Themen