在Clojure中施放nil

时间:2015-09-17 23:53:42

标签: clojure

我想从Clojure调用一个重载的Java方法,并且传入null(或Clojure中的nil)具有特殊意义。如果参数为nil

,如何确保调用正确的Java方法?

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

1 个答案:

答案 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 ...)。