clojure - 在 Clojure 中转换为 nil

标签 clojure

我想从 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/

相关文章:

clojure - Clojure WebSocket客户端

emacs - 如何在 Paredit 模式下删除多余的括号?

clojure - 在 clojure 中将向量拆分为向量向量而不是列表向量

clojure读取大文本文件并计算出现次数

clojure - 将 clojure.contrib.strint 与其他地方定义的字符串一起使用

tomcat - clojure、ring、tomcat 和 JSESSIONID

java - 使用 Netty 和 NIO 的高并发 HTTP

java - 如何通过 Clojure 启用 JClouds 和 Rackspace 的 CDN?

java - 带有需要枚举参数的注释的 clojure gen-class

clojure - 惰性序列最小-最大查找器 stackoverflow 问题