的數字操作我寫了一個函數做簡單的數學:斯卡拉專業化爲基本類型
def clamp(num: Double, min: Double, max: Double) =
if (num < min) min else if (num > max) max else num
這是非常簡單的,直到我需要用長型相同的功能。我與類型參數化和專業化概括它:
import Ordering.Implicits._
def clamp[@specialized N: Ordering](num: N, min: N, max: N) =
if (num < min) min else if (num > max) max else num
它的工作原理,但我發現,字節碼做大量的裝箱和拆箱的引擎蓋下:
public boolean clamp$mZc$sp(boolean num, boolean min, boolean max, Ordering<Object> evidence$1)
{
return Ordering.Implicits..MODULE$.infixOrderingOps(BoxesRunTime.boxToBoolean(num), evidence$1).$greater(BoxesRunTime.boxToBoolean(max)) ? max : Ordering.Implicits..MODULE$.infixOrderingOps(BoxesRunTime.boxToBoolean(num), evidence$1).$less(BoxesRunTime.boxToBoolean(min)) ? min : num;
}
public byte clamp$mBc$sp(byte num, byte min, byte max, Ordering<Object> evidence$1)
{
return Ordering.Implicits..MODULE$.infixOrderingOps(BoxesRunTime.boxToByte(num), evidence$1).$greater(BoxesRunTime.boxToByte(max)) ? max : Ordering.Implicits..MODULE$.infixOrderingOps(BoxesRunTime.boxToByte(num), evidence$1).$less(BoxesRunTime.boxToByte(min)) ? min : num;
}
public char clamp$mCc$sp(char num, char min, char max, Ordering<Object> evidence$1)
{
return Ordering.Implicits..MODULE$.infixOrderingOps(BoxesRunTime.boxToCharacter(num), evidence$1).$greater(BoxesRunTime.boxToCharacter(max)) ? max : Ordering.Implicits..MODULE$.infixOrderingOps(BoxesRunTime.boxToCharacter(num), evidence$1).$less(BoxesRunTime.boxToCharacter(min)) ? min : num;
}
有沒有更好的方式來做到廣義算術運算沒有拳擊?