我正在使用一些java.util.Date(它实现java.lang.Comparable)并且希望能够很好地使用它,例如使用<和> =而不是“compareTo(other)== 1”。有没有一种很好的方法可以很容易地混合scala.math.Ordered之类的东西没有很多锅炉板?
答案 0 :(得分:12)
在Ordering伴侣对象中,存在从Comparable [A]到Ordering [A]的隐式转换。所以你可以这样做:
import java.util.Date
val dateOrdering = implicitly[Ordering[Date]]
import dateOrdering._
val now = new Date
val then = new Date(now.getTime + 1000L)
println(now < then) // true
答案 1 :(得分:7)
我知道这是一个老问题,但这是一个稍微简单的解决方案,在提出问题时可能无法提供。
import scala.math.Ordering.Implicits._
任何实现Comparable
的Java类型都应该与比较运算符无缝协作。例如,
import java.time.Instant
val x = Instant.now()
val y = x.plusSeconds(1)
print(x < y) // prints true
print(x <= y) // prints true
print(x > y) // prints false
答案 2 :(得分:2)
在这种情况下,你不能混入Ordered
,afaik ......我尝试了它并遇到了困难,因为在compareTo
和java.lang.Comparable
都定义了Ordered
。编译器抱怨override
在方法定义中没有使用Ordering[Date]
;我不知道怎么解决这个问题。
因此定义隐式DateOrdering
。您可以将此import java.util.Date
implicit object DateOrdering extends Ordering[Date] {
def compare(x: Date, y: Date) = x compareTo y
}
对象放在任何位置(例如,在伴随对象中)。
import DateOrdering._
val a = new Date
Thread.sleep(1000)
val b = new Date
println(a < b) // prints true
println(a >= b) // prints false
然后在你的代码中:
Ordering
implicit def mkOrderingOps (lhs: T): Ops
对象包含Ops
。 <
类包含>=
。 Date
等方法,这个隐式def就是Ordering的类型参数(这里是任何{{1}}实例)的 pimp my library 模式的一个例子