2016-08-20 13 views
0

私はの7つの日時クラスのパラメータ化されたクラスIntervalを作成しようとしています。これはTInstantLocalTimeOffsetDateTime、またはOffsetTimeあるとき正常に動作しますが、後者の3つは、直接継承しないため、LocalDateLocalDateTime、およびZonedDateTimeのためにコンパイルに失敗しトリッキーなタイプの境界

final case class Interval[T <: Temporal with Ordered[T] with Serializable](start: T, end: T) 

:私のクラスのシグネチャは次のようになりますOrdered[T]私はInterval[T]の正しいタイプシグネチャが問題なく、すべての7つで機能しています。

経験が豊富な人が私に手を差し伸べることはできますか?あなたが答えの背後にある理論を説明してくれれば余分にありがとう!参考のため

が、ここでは7日付時刻クラスの署名です:私は少し異なるアプローチを取るだろう

trait ChronoLocalDate extends Temporal with TemporalAdjuster with Ordered[ChronoLocalDate] 
trait ChronoLocalDateTime[D <: ChronoLocalDate] extends Temporal with TemporalAdjuster with Ordered[ChronoLocalDateTime[_]] 
trait ChronoZonedDateTime[D <: ChronoLocalDate] extends Temporal with Ordered[ChronoZonedDateTime[_]] 

答えて

2

final class Instant private(private val seconds: Long, private val nanos: Int) extends TemporalAccessor with Temporal with TemporalAdjuster with Ordered[Instant] with Serializable 
final class LocalTime(_hour: Int, _minute: Int, _second: Int, private val nano: Int) extends TemporalAccessor with Temporal with TemporalAdjuster with Ordered[LocalTime] with Serializable 
final class OffsetDateTime private(private val dateTime: LocalDateTime, private val offset: ZoneOffset) extends Temporal with TemporalAdjuster with Ordered[OffsetDateTime] with Serializable 
final class OffsetTime(private val time: LocalTime, private val offset: ZoneOffset) extends TemporalAccessor with Temporal with TemporalAdjuster with Ordered[OffsetTime] with Serializable 
final class LocalDate private(private val year: Int, monthOfYear: Int, dayOfMonth: Int) extends ChronoLocalDate with Temporal with TemporalAdjuster with Serializable 
final class LocalDateTime private(private val date: LocalDate, private val time: LocalTime) extends ChronoLocalDateTime[LocalDate] with Temporal with TemporalAdjuster with Serializable 
final class ZonedDateTime(private val dateTime: LocalDateTime, private val offset: ZoneOffset, private val zone: ZoneId) extends ChronoZonedDateTime[LocalDate] with Temporal with Serializable 

ここでは、クラスの署名は、これらの最後の3つのChrono*特性のためですあなたが持っているものよりも、単純に暗黙のうちに密閉型の家系を使用して、すべてを抽象化します。これはまた、定義されていないクラスのために自分自身を注文する機会を与えます。再記述することができ

final case class Interval[ 
    T <: Temporal with Serializable 
](start: T, end: T)(implicit def ordering: Ordering[T]) 

:あなたは今、安全にScalaはあなたの順序を操作する2つの方法を可能にするという事実を利用することができます

final case class Interval[ 
    T <: Temporal with Serializable : Ordering 
](start: T, end: T) 

、一つは、相続経由のJavaの古い学校の方法です(Comparableを実装する)、Scalaの場合はOrdered、もう1つはOrdering[T]です。これは常に暗黙のスコープを通過します。

そして、あなたはあなたのクラスの独立のために供給することによってそれを行うことができます:あなたが順序を必要と種類ごとに、その上

object TimeOrdering { 
    implicit object ChronoLocalDateOrdering extends Ordering[ChronoLocalDate] { 
    override def compare(x: ChronoLocalDate, y: ChronoLocalDate): Int = ??? 
    } 
} 

をと。

次に、あなたは簡単に行うことができます。

val x: ChronoLocalDate = ... 
val y: ChronoLocalDate = ... 
import TimeOrdering._ // to get the implicits in scope. 
val interval = Interval(x, y)