2017-04-20 61 views
1

我是斯卡拉新手。 我有一個函數:Scala:通用整數返回類型?

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

是否有可能使返回類型通用(整數類型,龍,智力)? 在此先感謝...

回答

2

你可以有一個通用的返回類型,如果一個泛型參數匹配...

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

...但你不能基於不同的(通用)返回類型在某些內部條件下(例如,累計總和的值)。

+0

THX的答覆。是否有可能使「總和」也是通用的?我想避免一遍又一遍地複製相同的代碼,但只改變返回類型。 – paul

+0

@paul數字有一個總和函數 –

+0

@paul,我已經改變了例子返回任何數字類型的數組的總和。返回類型匹配'Array'類型。如果總和值可能溢出輸入類型,那麼你需要採用不同的方法。 – jwvh

0

從技術上講,是的,它很可能:

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 
} 

這意味着主叫方決定返回類型,這樣他們就可以寫例如

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

或指定的預期類型

val x: BigInt = fromBinaryListBig(...)