2015-09-09 10 views
5

Ich habe diese Funktion in einem Namensraum eindeutig zu machen, die nicht/nicht importieren benötigen/verwenden, um alle anderen Pakete:Wie in Clojure

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

Cursive (die IntelliJ IDEA IDE Plugin) hebt Throwable und gibt mir die Nachricht Cannot disambiguate overloads of Throwable . Ich bekomme die gleiche Nachricht mit Exception und Error.

Ich verstehe nicht die Quelle dieser Nachricht - ich bezweifle, dass diese Java-Klassen in anderen Jar-Dateien als die Java-Sprache definiert sind. Alles, was ich kann, um diese Botschaft verschwinden zu lassen?

Diese sind in der project.clj:

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

Antwort

9

Throwable hat zwei 1-Arg- Konstruktoren (doc): man eine String und die andere eine erwartete Throwable erwarten.

Während der Laufzeit Clojure es heraus (da in diesem speziellen Fall ist es unmöglich für ein Objekt ein String und Throwable sein), aber dies erfordert die Verwendung von Reflexion.

Wenn Sie einen Typhinweis zu msg hinzufügen, um anzugeben, welche Überladung Sie verwenden möchten, würde die Notwendigkeit zur Reflektion beseitigt und Cursetive hoffentlich beruhigt.

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

Sowohl die Diagnose als auch die Lösung sind hier richtig - ich sollte diese Botschaft wahrscheinlich freundlicher machen. Cursive versucht zu warnen, wann immer Interop eine Reflektion erfordert, wobei dieselbe Logik wie der Compiler verwendet wird. – Colin

+1

@Colin könnten Sie die Überladung des Kandidaten auflisten? – cgrand

+1

Ja, das habe ich ausprobiert, aber die Tooltipps wurden gelegentlich extrem groß. Ich werde es noch einmal versuchen und sehen, ob ich das umgehen kann. – Colin