我正在努力实施 org.joda.time.ReadableInstant 它继承自通用接口,但显然这不重要。 The interface 是:
public interface ReadableInstant extends Comparable<ReadableInstant> { long getMillis(); Chronology getChronology(); DateTimeZone getZone(); int get(DateTimeFieldType type); boolean isSupported(DateTimeFieldType field); Instant toInstant(); boolean isEqual(ReadableInstant instant); boolean isAfter(ReadableInstant instant); boolean isBefore(ReadableInstant instant); boolean equals(Object readableInstant); int hashCode(); String toString(); }
我的记录:
(defrecord WeirdDate [year month day] ReadableInstant (^boolean equals [this ^Object readableInstant] (.equals (as-date this) readableInstant)) (^int get [this ^DateTimeFieldType type] (get (as-date this) type)) (^Chronology getChronology [this] (.getChronology (as-date this))) (^long getMillis [this] (.getMillis (as-date this))) (^DateTimeZone getZone [this] (.getZone (as-date this))) (^int hashCode [this] (.hashCode (as-date this))) (^boolean isAfter [this ^ReadableInstant instant] (.isAfter (as-date this) instant)) (^boolean isBefore [this ^ReadableInstant instant] (.isBefore (as-date this) instant)) (^boolean isEqual [this ^ReadableInstant instant] (.isEqual (as-date this) instant)) (^boolean isSupported [this ^DateTimeFieldType field] (.isSupported (as-date this) field)) (^Instant.toInstant [this] (.toInstant (as-date this))) (^String toString [this] (.toString (as-date this))))
但我得到了错误:
java.lang.IllegalArgumentException: Must hint overloaded method: get
我的类型提示错误吗?还有其他问题吗?
(向您在 Clojure mailing list where I've already asked a longer version of this question ,我认为这里的一个简短问题可能更容易回答)
不能使用defrecord实现具有 get 方法,因为 收到 已在java.util.Map上定义,defrecord会自动为您实现。如果你想实现这个接口,你必须放弃mappiness的细节,只使用一个简单的deftype。此外,代码中的每个类型提示都是完全不必要的:编译器知道您正在实现的接口的类型,不需要您的帮助来确定它们。
get
收到