我需要一个方法来返回两个有序值中的第一个.我试过了:
def first[T <: Ordered[T]](a: T,b: T) = { a compare b match { case -1 | 0 => a case 1 => b } }
但得到
scala> first(3,4) <console>:9: error: inferred type arguments [Int] do not conform to method first's type parameter bounds [T <: Ordered[T]] first(3,4) ^
我想这是因为Int需要转换为RichInt,它是Ordered [Int]而不是Ordered [RichInt].接下来是什么?
解决方法
您可以使用类型类Ordering和context bound:
def first[T : Ordering](a: T,b: T) = { implicitly[Ordering[T]].compare(a,b) match { case -1 | 0 => a case 1 => b } }
更新
如果导入scala.math.Ordered._,则可以进一步简化此代码. Companion object of Ordered
有orderedToOrdered隐式转换,因此具有Ordering的所有内容也将被视为Ordered:
import scala.math.Ordered._ def first[T : Ordering](a: T,b: T) = if (a <= b) a else b