Generics 返回两个值中第一个值的泛型方法

Generics 返回两个值中第一个值的泛型方法,generics,scala,Generics,Scala,我需要一个方法来返回两个有序值中的第一个。我试过: def first[T <: Ordered[T]](a: T, b: T) = { a compare b match { case -1 | 0 => a case 1 => b } } def first[T a 案例1=>b } } 但是得到 scala> first(3,4) <console>:9: error: inferred type arguments

我需要一个方法来返回两个有序值中的第一个。我试过:

def first[T <: Ordered[T]](a: T, b: T) = {
  a compare b match {
    case -1 | 0 => a
    case 1      => b
  }
}
def first[T a
案例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)
       ^
scala>第一(3,4)
:9:错误:推断的类型参数[Int]不符合方法first的

类型参数边界[T您可以使用类型类
排序
和上下文边界:

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.
.has
orderingToOrdered
隐式转换,则此代码可以进一步简化,因此具有
排序
的所有内容也将被视为
已排序

import scala.math.Ordered._

def first[T : Ordering](a: T, b: T) = if (a <= b) a else b
导入scala.math.Ordered_

def first[T:Ordering](a:T,b:T)=如果(a我认为您正在寻找视图绑定

在幕后,视图绑定将编译成一个隐式参数,该参数将类型
T
转换为
Ordered[T]


编辑。在Scala 2.8中引入,
排序
可能是进行比较的首选方式,但我找不到任何明确的指导。我想
排序
的优点是与Java的
可比
兼容,正如其他人所指出的,
排序
O之间存在隐式转换排序

您可以简单地使用隐式参数并使用排序方法使其更清晰:

def first[T](a: T, b: T)( implicit ord: Ordering[T] ) = {
  import ord._
  if( a <= b ) a else b
}

关于上下文与视图边界——在Daniel的回答(您已经链接)中,他写道:“与typeclass模式绑定的上下文更有可能被您自己的类使用,因为它们可以分离关注点,而视图边界可以通过良好的设计在您自己的代码中避免(它主要用于绕过其他人的设计)。”。在本例中,视图绑定用于绕过Java的设计,即
Int
(作为原语)未实现
有序的
scala> first(3, 2)
res3: Int = 2
def first[T](a: T, b: T)( implicit ord: Ordering[T] ) = {
  import ord._
  if( a <= b ) a else b
}
def first[T](a: T, b: T)( implicit ord: Ordering[T] ) = 
  ord.min(a,b)