Как устранить неоднозначность в 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)))