Как устранить неоднозначность в Clojure

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

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

Курсив (плагин IntelliJ IDEA IDE) подчеркивает 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"]]

1 ответ

Решение

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

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

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

(defn crash [^String msg]
  (throw (Throwable. msg)))
Другие вопросы по тегам