2015-09-09 6 views
5

ho questa funzione in uno spazio dei nomi che non/importare richiede/utilizzare qualsiasi altro pacchetto:Come disambiguare in Clojure

(defn crash [msg] 
    (throw (Throwable. msg))) 

Cursive (l'idea IntelliJ IDE Plugin) mette in evidenza Throwable e mi dà il messaggio Cannot disambiguate overloads of Throwable . Ottengo lo stesso messaggio con Exception e Error.

Non capisco la fonte di questo messaggio - Dubito che queste classi Java siano definite in altri file jar diversi da quelli in linguaggio Java. Tutto ciò che posso per far sparire questo messaggio?

Questi sono nella project.clj:

:dependencies [[org.clojure/clojure "1.6.0"] 
       [net.mikera/imagez "0.8.0"] 
       [org.clojure/math.numeric-tower "0.0.4"]] 

risposta

9

Throwable ha due costruttori 1-arg (doc): uno in attesa di un String e l'altro in attesa di un Throwable.

Al runtime Clojure lo rileva (poiché, in questo caso specifico, è impossibile che un oggetto sia sia un String sia un Throwable) ma ciò richiede l'uso della riflessione.

Aggiunta di un suggerimento tipo a msg per specificare quale sovraccarico si prevede di utilizzare rimuoverà la necessità di riflessione e si spera si calmerà Corsivo verso il basso.

(defn crash [^String msg] 
    (throw (Throwable. msg))) 
+1

Sia la diagnosi sia la soluzione sono corrette qui - probabilmente dovrei rendere questo messaggio più amichevole. Cursive tenta di avvisare ogni volta che interop richiederà la riflessione usando la stessa logica del compilatore. – Colin

+1

@Colin puoi elencare i sovraccarichi candidati? – cgrand

+1

Sì, l'ho provato, ma i tooltip di tanto in tanto sono diventati estremamente grandi. Ci proverò di nuovo e vedrò se riesco a risolvere il problema. – Colin