在 Scala 中,我希望能够编写使用 >、/、* 等运算符的通用类,但我不知道如何约束 T 以使其起作用。
我研究了用 Ordered[T] 约束 T,但这似乎不起作用,因为只有 RichXXX(例如 RichInt)扩展它,而不是 Int 等。我还看到了 Numeric[T],这是否仅在 Scala 2.8 中可用?
这是一个具体的例子:
class MaxOfList[T](list: List[T] ) {
def max = {
val seed: Option[T] = None
list
.map( t => Some(t))
// Get the max
.foldLeft(seed)((i,m) => getMax(i,m) )
}
private def getMax(x: Option[T], y: Option[T]) = {
if ( x.isDefined && y.isDefined )
if ( x > y ) x else y
else if ( x.isDefined )
x
else
y
}
}
这个类不会编译,因为有很多不支持 > 等的 T。
想法?
现在我已经使用了 MixIn 特征来解决这个问题:
/** Defines a trait that can get the max of two generic values
*/
trait MaxFunction[T] {
def getMax(x:T, y:T): T
}
/** An implementation of MaxFunction for Int
*/
trait IntMaxFunction extends MaxFunction[Int] {
def getMax(x: Int, y: Int) = x.max(y)
}
/** An implementation of MaxFunction for Double
*/
trait DoubleMaxFunction extends MaxFunction[Double] {
def getMax(x: Double, y: Double) = x.max(y)
}
如果我们改变原始类,可以在实例化时混合。
PS Mitch,受您重写 getMax 的启发,这里是另一个:
private def getMax(xOption: Option[T], yOption: Option[T]): Option[T] = (xOption,yOption) match {
case (Some(x),Some(y)) => if ( x > y ) xOption else yOption
case (Some(x), _) => xOption
case _ => yOption
}