【发布时间】:2015-11-09 00:23:58
【问题描述】:
我写了一个函数来做简单的数学运算:
def clamp(num: Double, min: Double, max: Double) =
if (num < min) min else if (num > max) max else num
这很简单,直到我需要与 Long 类型相同的功能。我用类型参数和特化对其进行了概括:
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;
}
有没有更好的方法在不装箱的情况下进行广义算术运算?
【问题讨论】:
标签: scala types parameters specialization