0

I'm trying to implement org.joda.time.ReadableInstant. It inherits from a generic interface, but apparently that shouldn't matter. The interface is:

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();
}

My record:

(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))))

But I get the error:

java.lang.IllegalArgumentException: Must hint overloaded method: get

Are my type hints wrong? Is there something else wrong?

(Apologies for those of you on the Clojure mailing list where I've already asked a longer version of this question, I thought that a shorter question here might be easier to answer)

1 Answer 1

2

You can't use a defrecord to implement a type with a get method, because get is already defined on java.util.Map, which defrecord automatically implements for you. If you want to implement this interface, you will have to forego the niceties of mappiness and just use a plain deftype. Also, every type hint in your code is completely unnecessary: the compiler knows the types of the interface you're implementing, and doesn't need your help to figure them out.

Sign up to request clarification or add additional context in comments.

2 Comments

Re type annotations, I suspected as much, it's just that the message appeared to be saying 'add more annotations!'.
Thanks very much for your answer, that was it. I'm running into another problem, perhaps you could spare a minute? stackoverflow.com/questions/25786493/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.