在Clojure中调用一个静态的Java方法很顺利,没有问题。但是当我调用一个非静态方法时,它会抛出一个错误,尽管我已经尝试了几种点(.)符号的变化,如在 Clojure Interop文档.
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
你在这里有两个不同的问题。在第一个例子中,你试图在类上调用一个方法。CljHelper
. 你应该在实例上调用它,而不是类。
(.test (CljHelper.) "This is a test")
对于第二个例子,你有一组额外的括号。所以,你正确地调用了方法 test
但这样一来,你就会把结果,也就是空值,并试图把它作为一个函数来调用。所以只要去掉括号就可以了。
(defn add-id
[x]
(let [c (CljHelper.)]
(.test c x)))
下面是最简单的方法。 做一个java类Calc.Clojure。
package demo;
public class Calc {
public int answer() {
return 42;
}
}
并在Clojure中调用它
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:import [demo Calc]))
(let [c (Calc.)] ; construct an instance of Calc
(println :answer (.answer c))) ; call the instance method
用result调用它
:answer 42
你可以 克隆一个模板Clojure项目 开始。