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