代码之家  ›  专栏  ›  技术社区  ›  Joe

如何使用Clojure记录实现这个通用Java接口?

  •  0
  • Joe  · 技术社区  · 11 年前

    我正在努力实施 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 ,我认为这里的一个简短问题可能更容易回答)

    1 回复  |  直到 11 年前
        1
  •  2
  •   amalloy    11 年前

    不能使用defrecord实现具有 get 方法,因为 收到 已在java.util.Map上定义,defrecord会自动为您实现。如果你想实现这个接口,你必须放弃mappiness的细节,只使用一个简单的deftype。此外,代码中的每个类型提示都是完全不必要的:编译器知道您正在实现的接口的类型,不需要您的帮助来确定它们。

    推荐文章