Я хочу использовать java.time.LocalDate
и java.time.LocalDateTime
с неявным Ordered
:
val date1 = java.time.LocalDate.of(2000, 1, 1)
val date2 = java.time.LocalDate.of(2010, 10, 10)
if (date1 < date2) ...
import scala.math.Ordering.Implicits._
не работает, потому что LocalDate
наследует от Comparable<ChronoLocalDate>
вместо Comparable<LocalDate>
. Как я могу написать свой собственный неявный Orderd для использования <, <=,>,> = операторов/методов для сравнения LocalDate
?
Редактировать:
Я нашел способ использования неявного класса:
import java.time.{LocalDate}
object MyDateTimeUtils {
implicit class MyLocalDateImprovements(val ld: LocalDate)
extends Ordered[LocalDate] {
def compare(that: LocalDate): Int = ld.compareTo(that)
}
}
// Test
import MyDateTimeUtils._
val d1 = LocalDate.of(2016, 1, 1)
val d2 = LocalDate.of(2017, 2, 3)
if (d1 < d2) println("d1 is less than d2")
Но я бы предпочел такой способ, как Scala для всех классов Java, который реализует Comparable<T>
. Вам просто нужно import scala.math.Ordering.Implicits._
в свой код. Scala реализует его как:
implicit def ordered[A <% Comparable[A]]: Ordering[A] = new Ordering[A] {
def compare(x: A, y: A): Int = x compareTo y
}
Но, к сожалению, LocalDate
реализует LocalDate
Comparable<ChronoLocalDate>
вместо Comparable<LocalDate>
. Я не мог найти способ изменить вышеупомянутый неявный упорядоченный метод, чтобы он соответствовал LocalDate
/Comparable<ChronoLocalDate>
. Любая идея?