Как реализовать TemporalAdjuster в Clojure - PullRequest
0 голосов
/ 03 марта 2019

Новичок Clojure, здесь.

Я пытаюсь реализовать TemporalAdjuster в Clojure.У меня есть следующее:

(ns pto-calculator.logic.pay-periods
  (:require [java-time :as j]))

(def next-pay-period
  (reify java.time.temporal.TemporalAdjuster
    (adjustInto [this temporal]
      (let [local-date (java.time.LocalDate/from temporal)
            day-of-month (.getDayOfMonth local-date)]
        (if (< 14 day-of-month)
          (j/plus local-date (j/days (- 14 day-of-month)))
          (j/adjust local-date :last-day-of-month))))))

(defn get-next-pay-period [date]
  (j/adjust date next-pay-period))

И я называю это так:

(ns pto-calculator.core
  (:require [pto-calculator.logic.pay-periods :as p]
            [java-time :as j])
  (:gen-class))

(defn -main
  [& args]
  (p/get-next-pay-period j/local-date))

Сегодня 2 марта, поэтому я ожидаю, что get-next-pay-period вернется 14 марта, однако яВместо этого я получаю исключение:

Caused by: java.lang.ClassCastException: java_time.local$local_date cannot be cast to java.time.temporal.Temporal
    at java_time.adjuster$adjust.invokeStatic(adjuster.clj:64)
    at java_time.adjuster$adjust.doInvoke(adjuster.clj:40)
    at clojure.lang.RestFn.invoke(RestFn.java:425)
    at pto_calculator.logic.pay_periods$get_next_pay_period.invokeStatic(pay_periods.clj:19)
    at pto_calculator.logic.pay_periods$get_next_pay_period.invoke(pay_periods.clj:18)

Моя путаница заключается в следующем: (j/local-date) возвращает экземпляр java.time.LocalDate, который является Temporal (согласно документам ).Так почему бы это не сработало?

Я также пытался:

(defn get-next-pay-period [^java.time.temporal.Temporal date]
...

Но в этом случае я получаю эту ошибку:

java_time.local$local_date cannot be cast to java.time.temporal.Temporal

Есть лиразница между java_time.local$local_date и java.time.LocalDate?

1 Ответ

0 голосов
/ 03 марта 2019

Вы не вызываете java-time/local-date в своем основном пространстве имен.Вы передаете функцию на get-next-pay-period.

Вместо:

(defn -main
  [& args]
  (p/get-next-pay-period j/local-date))

Попробуйте:

(defn -main
  [& args]
  (p/get-next-pay-period (j/local-date)))
...