【发布时间】:2020-06-10 22:35:58
【问题描述】:
在 Clojure 中调用静态 Java 方法很顺利;没问题。但是当我调用一个非静态方法时,它会抛出一个错误,尽管我已经尝试了点 (.) 表示法的几种变体,如 Clojure Interop documentation 中所述。
Java 类:
public class CljHelper {
public void test(String text) {
System.out.println(text);
}
}
Clojure 代码:
(ns com.acme.clojure.Play
(:import [com.acme.helpers CljHelper]))
(. CljHelper test "This is a test")
错误:
java.lang.IllegalArgumentException: No matching method: test
这是另一个尝试,它使 Java 方法被执行,但之后立即抛出错误:
(defn add-Id
[x]
(let [c (CljHelper.)]
((.test c x)))) ;;; java.lang.NullPointerException: null in this line
(add-Id "id42")
错误:
java.lang.NullPointerException: null
【问题讨论】:
-
删除外部括号
((.test c x))- 你调用的是测试结果,它是 nil - 括号总是有意义的,不能像花括号语言那样添加以使事情更清楚。 -
是的,你是对的;有一组额外的括号。