2016-04-10 13 views
0

Ich versuche, eine Möglichkeit zu schaffen, Tage zu einem LocalDate-Objekt in Scala durch implizite Klassen hinzuzufügen, aber ich bekomme ständig einen Fehler entweder "LocalDate ist eine letzte Klasse und kann nicht erweitert werden" oder darunter:Scala implizite finale Klasse

scala:73: could not find implicit value for parameter year: Int

Hier ist der Code, den ich versucht mit:

implicit class UVMLocalDate(val me: Int) extends AnyVal{ 

implicit def days(implicit year: Int, month: Int, day: Int) { 
LocalDate.of(year,month,me + days) 
} 

} 

ich die Klasse verhalten zu haben, wie so eingeschränkt bin:

(LocalDate.of(2015, 4, 14)) == (LocalDate.of(2015, 4, 12) + 2.days)

Beispiel für die Verwendung:

val dateEx = LocalDate.of(2015, 3, 23) + 2.days 
assert(dateEx == LocalDate.of(2015, 3, 25)) 

Dank

+0

Verwenden Sie java.time? In diesem Fall können Sie nicht zwei 'LocalDates' zusammenfügen. Es bietet auch keine Scala '+' Methode. –

+0

Auch Sie nehmen 3 implizite Int-Argumente zu Ihrer "days" -Methode, implizite Argumente werden nach Typ aufgelöst, so dass Sie immer den gleichen Wert für alle 3 Argumente hätten. –

+0

Ich kann nicht viel Verbindung zwischen der eingefügten impliziten Klasse und der Art finden, wie sie sich verhalten soll. – pedrofurla

Antwort

2

Klingt wie Sie eine Mischung aus Features von scala.concurrent.duration._ und org.joda.time._ wollen.

sie nicht wirklich sinnvoll, ein Datum zu einem anderen Datum zu addieren und 2.days ist nicht wirklich ein Datum sondern eine Dauer. Sie könnten weitermachen und neu erfinden das Rad durch eine neue Klasse für sie zu definieren:

class Duration(millis: Long) 
object Duration { 
    val SecondMillis = 1000 
    val MinuteMillis = SecondMillis * 60 
    val HourMillis = MinuteMillis * 60 
    val DayMillis = HourMillis * 24 

    implicit class DurationFromDays(private val underlying: Int) extends AnyVal { 
    def days: Duration = new Duration(underlying * DayMillis) 
    } 
} 

Sie jedoch nur die API von scala.concurrent.duration.Duration nutzen könnten.

Und dann müssen Sie auch eine implizite Klasse für das Hinzufügen eines Duration zu einem LocalDate definieren.

implicit class LocalDateOps(private val underlying: LocalDate) extends AnyVal { 
    def +(duration: Duration): LocalDate = ??? 
} 

Allerdings gibt es Bibliotheken (wie joda Zeit), wo die Funktionalität eine Dauer zu einem Datum hinzuzufügen, ist bereits realisiert.

Verwandte Themen