Я наткнулся на этот вопрос, потому что я тоже хотел сравнить объекты joda DateTime с использованием реляционных операторов.
Ответ Даниэля указал мне правильное направление: импликации, присутствующие в scala.math.Ordered
, преобразуют экземплярот A extends java.lang.Comparable[A]
до Ordered[A]
- их просто нужно ввести в сферу применения.Самый простой способ сделать это (который я выучил здесь , кстати), это метод implicitly
:
val aOrdering = implicitly[Ordering[A]]
import aOrdering._
Уловка в том, что org.joda.time.DateTime
не расширяет и не реализуетComparable
сам по себе, он наследует (косвенно) от org.joda.time.ReadableInstant
, который делает расширяет Comparable
.Так что это:
val dateTimeOrdering = implicitly[Ordering[DateTime]]
import dateTimeOrdering._
не скомпилируется, потому что DateTime
не расширяет Comparable[DateTime]
.Чтобы использовать Ordered
реляционные операторы на DateTime
, вы должны сделать это вместо этого:
val instantOrdering = implicitly[Ordering[ReadableInstant]]
import instantOrdering._
, который работает, потому что ReadableInstant
расширяет Comparable[ReadableInstant]
, а неявные преобразования в Ordered
можно преобразовать его в Ordered[ReadableInstant]
.
Пока все хорошо.Однако бывают ситуации, когда Ordered[ReadableInstant]
недостаточно хорош.(Я столкнулся с тем, что ScalaTest на больше и меньше, чем Matchers .) Чтобы получить Ordered[DateTime]
, я был вынужден сделать следующее:
implicit object DateTimeOrdering extends Ordering[DateTime] {
def compare(d1: DateTime, d2: DateTime) = d1.compareTo(d2)
}
Кажется, чтобыло бы проще, но я не мог понять это.