2015-09-09 1 views
5

У меня есть эта функция в пространстве имен, не импортировать/требуется/использовать любые другие пакеты:Как неоднозначность в Clojure

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

Курсив (IntelliJ IDEA IDE Plugin) выдвигает на первый план Throwable и дает мне сообщение Cannot disambiguate overloads of Throwable , Я получаю то же сообщение с Exception и Error.

Я не понимаю источник этого сообщения. Я сомневаюсь, что эти классы Java определены в любых других файлах jar, кроме Java-языков. Все, что я могу сделать, чтобы это сообщение исчезло?

Они находятся в project.clj:

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

ответ

9

Throwable имеет два 1-Arg конструкторов (doc): одна ожидает String, а другие ожидают Throwable.

Во время выполнения Clojure вычисляет его (поскольку в данном конкретном случае объект не может быть как String, так и Throwable), но для этого требуется использование отражения.

Добавление типа-подсказки к msg, чтобы указать, какая перегрузка вы ожидаете использовать, устранит необходимость в отражении и, надеюсь, успокоится.

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

Как диагностика, так и решение здесь верны - я должен, вероятно, сделать это сообщение более дружелюбным. Cursive пытается предупредить, когда interop потребует отражения, используя ту же логику, что и компилятор. – Colin

+1

@Colin вы можете перечислить перегрузки кандидата? – cgrand

+1

Да, я пробовал это, но подсказки иногда становились чрезвычайно большими. Я попробую еще раз и посмотрю, смогу ли я обойти это. – Colin