我想从Clojure调用一个重载的Java方法,并且传入null
(或Clojure中的nil
)具有特殊意义。如果参数为nil
?
e.g。假设重载的Java方法如下:
public class Foo {
public String bar(String s) {
return (s == null) ? "default" : s;
}
public String bar(Integer i) {
return (i == null) ? "0" : i.toString();
}
}
我想得到值"default"
,所以我想在我的Clojure代码中执行以下操作:
(.bar (Foo.) (cast String nil))
我在两个稍微不同的环境中对此进行了测试,但我得不到一致的结果。并且看起来在Clojure中输出nil
值并不会产生预期的类型,例如: -
(type (cast String nil))
; => nil
答案 0 :(得分:4)
cast
没有做你认为它只是确保第二个参数是指定类并返回它(第二个参数,而不是类)或抛出异常。
您需要添加类型提示,但无法将其直接添加到nil
:
=> (String. nil)
CompilerException java.lang.IllegalArgumentException: More than one matching method found: java.lang.String
这里我有一个例外,因为nil
匹配过多的重载并且编译器不知道要选哪个。
=> (let [^String cnil nil] (String. cnil))
NullPointerException java.lang.String.<init> (String.java:152)
这里我有一个异常但是来自构造函数:类型提示允许编译器选择正确的重载(过载抱怨传递nil
...)。