2014-04-09 10 views
7

Bir protokolProtokollerdeki ipucu dönüş türlerinin Clojure içinde herhangi bir etkisi var mı?

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

bir dönüş türü ipucu olabilir ve derleyici yöntemlerinizi uymak yapacak:

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

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

Ama tip ipucu onurlandırmak gerekmez:

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

(age (new person)) 
; "one" 

Yazımın bir etkisi var mı?


Bu

bir Can you specify the return type of a method in a clojure defrecord?

+0

tipi ipuçları yersiz bulunmaktadır. Olmalı gibi (age^String [this] "one") '. Derleyici, yöntemleri * uydurmaz. – Thumbnail

+0

Kafa karıştıran, ancak siz olduğu gibi yöntem adıyla, defrecord'daki tür ipucu için doğru konumdur (bkz. Doc). İlkel olmayan ipuçları, ilkel ipuçları göz ardı edilebilecek gibi görünmüyor ve ilkel ipuçlarının onları uygulama yeteneğini kırdığı görülüyor. Cevabımı en iyi şekilde spekülatif olarak sildim. –

+0

@ A.Webb Çabalarınız için teşekkür ederiz. Ben kendimi dahil şaşkın, bir uyarı levhası uyarı olarak soru terk etmek eğilimindeyim. – Thumbnail

cevap

3

döndürme türü ipucu etiketi olarak protokol fonksiyonu age gider takip olduğunu. Oradan, etiket yerel tür çıkarımda kullanılır. Uygulamasına gözlemlemek için:

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

tip ipucu bıraktığı ya da etmezsin ima etti türüne bir yöntemi çağırmak durumunda, derleyici yerine, bir (yavaş) reflektör içine çağrı ekler olsaydı düz dökme:

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

İlgili konular