【问题标题】:Casting nil in Clojure在 Clojure 中铸造 nil
【发布时间】:2015-09-18 15:37:26
【问题描述】:

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

【问题讨论】:

  • 有趣。您希望这在 Java 中如何解决?
  • 在 Java 中,可以只执行 new Foo().bar((String) null); 以确保调用正确的重载方法(即方法签名中带有 String 的方法)。
  • 类型提示可以解决问题。请参阅stackoverflow.com/questions/2722856/… 的已接受答案
  • 感谢@nberger,输入提示成功了:D

标签: clojure


【解决方案1】:

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

【讨论】:

  • 明白了,谢谢@cgrand。我仍然希望该值为null(并接受结果)。问题在于强制调用正确的重载方法,但类型提示有效。我不知道您可以在let 表单中输入提示,感谢您的洞察:D
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2013-12-17
相关资源
最近更新 更多