我想从 Clojure 中调用重载的 Java 方法,传入 null
(或 Clojure 中的 nil
)具有特殊含义。如果参数为 nil
,我如何确保调用正确的 Java 方法?
例如假设重载的 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
最佳答案
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)
这里我有一个异常(exception),但来自构造函数:类型提示允许编译器选择适当的重载(该重载提示传递了一个 nil
...)。
关于clojure - 在 Clojure 中转换为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641762/