微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

泛型 – 返回两个值中的第一个的通用方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐