如何在 Clojure 中消除歧义

How to disambiguate in Clojure

我在没有 import/require/use 任何其他包的命名空间中有这个函数:

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

Cursive(IntelliJ IDEA IDE 插件)突出显示 Throwable 并给我消息 Cannot disambiguate overloads of Throwable。我收到与 ExceptionError 相同的消息。

我不明白此消息的来源 - 我怀疑这些 Java 类 是在除 Java 语言之外的任何其他 jar 文件中定义的。有什么办法可以让这条消息消失吗?

这些在 project.clj:

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

Throwable 有两个 1-arg 构造函数 (doc):一个期望 String,另一个期望 Throwable.

在运行时 Clojure 会弄明白(因为在这种特定情况下,一个对象不可能既是 String 又是 Throwable),但这需要使用反射。

msg 添加类型提示以指定您希望使用的重载将消除反射的需要,并有望使 Cursive 平静下来。

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