我正在使用一些 java.util.Date(它实现了 java.lang.Comparable)并且希望能够很好地使用它,例如使用 < 和 >= 而不是“compareTo(other) == 1”。有没有一种很好的方法可以轻松地混合像 scala.math.Ordered 这样的东西而没有很多样板?
问问题
3181 次
3 回答
13
在 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
于 2011-12-13T04:59:10.963 回答
10
我知道这是一个老问题,但这里有一个稍微简单的解决方案,在提出问题时可能不可用。
import scala.math.Ordering.Implicits._
任何实现的 Java 类型都Comparable
应该与比较运算符无缝协作。例如,
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
于 2015-09-16T16:18:31.973 回答
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
包含<
. >=
等方法,这个隐含的 def 是我的库模式的一个例子,无论 Ordering 的类型参数是什么(这里是任何Date
实例)。
于 2011-12-13T04:33:42.270 回答