2015-09-09 25 views
5

歧义我有一个命名空间中,此功能不导入/要求/使用任何其它软件包:如何用Clojure

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

行草(的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"]] 

回答

9

Throwable具有两个1参数构造(doc):一个期待String和其他期待一个Throwable

Clojure在运行时计算出来(因为在这种特殊情况下,对象不可能是StringThrowable),但这需要使用反射。

添加一个类型提示msg指定哪个超载您希望使用将消除反射的需要,希望平静下来狂草。

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

这里的诊断和解决方案都是正确的 - 我应该让这个信息更友好。当互操作需要使用与编译器相同的逻辑进行反射时,Cursive会尝试发出警告。 – Colin

+1

@Colin你能列出候选重载吗? – cgrand

+1

是的,我尝试过,但工具提示偶尔变得非常大。我会再试一次,看看我能否解决这个问题。 – Colin