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

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

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

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...