2014-04-09 9 views
7

można schować typ zwracanej w protokoleCzy wskazanie typów powrotu w protokołach ma jakiś wpływ w Clojure?

(defprotocol Individual 
    (^Integer age [this])) 

i kompilator uczyni Twoje metody są zgodne:

(defrecord person [] 
    Individual 
    (^String age [this] "one")) 

; CompilerException java.lang.IllegalArgumentException: Mismatched return type: age, expected: java.lang.Object, had: java.lang.String, ... 

Ale nie trzeba uczcić typu podpowiedź:

(defrecord person [] 
    Individual 
    (age [this] "one")) 

(age (new person)) 
; "one" 

Czy wskazówka typu ma jakikolwiek wpływ?


Jest kontynuacją Can you specify the return type of a method in a clojure defrecord?

+0

Wskazówki dotyczące typów są niewłaściwie umieszczone. Powinien być podobny do '(age^String [this]" one ")'. Kompilator * nie * powoduje, że metody są zgodne. – Thumbnail

+0

Mylące, ale na nazwę metody, jak to było to właściwe miejsce na wskazówkę typu w defrecord (patrz doc). Nie wiem, czy w defprotocol jest poprawne miejsce, ponieważ nie prymitywne wskazówki wydają się być ignorowane, a prymitywne wskazówki zdają się łamać zdolność do ich implementacji. W najlepszym razie usunąłem swoją odpowiedź jako spekulacyjną. –

+0

@ A.Webb Dziękuję za twoje wysiłki. Jestem skłonny zostawić to pytanie jako drogowskaz ostrzegający otumanionych, włącznie z mną. – Thumbnail

Odpowiedz

3

Zwrot typ wskazówka idzie do funkcji protokołu age jako znacznik. Stamtąd tag jest używany w lokalnych wnioskach typu. Obserwować w działaniu:

- (.longValue (age (new person))) ClassCastException java.lang.String cannot be cast to java.lang.Integer net.bendlas.lintox/eval18038 (form-init4752901931682060526.clj:1) ;; longValue is a method of Integer, so a direct cast has been inserted

Jeśli wskazówka typ została przerwana, lub jeśli wywołanie metody nie na zasugerował typu, kompilator wstawia (wolny) zadzwonić do reflektora, zamiast odlewane:

- (.otherMethod (age (new person))) IllegalArgumentException No matching field found: otherMethod for class java.lang.String clojure.lang.Reflector.getInstanceField (Reflector.java:271)

Powiązane problemy