在Clojure中调用非静态Java方法。

问题描述 投票:0回答:1

在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
java clojure interop
1个回答
6
投票

你在这里有两个不同的问题。在第一个例子中,你试图在类上调用一个方法。CljHelper. 你应该在实例上调用它,而不是类。

(.test (CljHelper.) "This is a test")

对于第二个例子,你有一组额外的括号。所以,你正确地调用了方法 test但这样一来,你就会把结果,也就是空值,并试图把它作为一个函数来调用。所以只要去掉括号就可以了。

(defn add-id
  [x]
  (let [c (CljHelper.)]
    (.test c x)))

4
投票

下面是最简单的方法。 做一个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项目 开始。

© www.soinside.com 2019 - 2024. All rights reserved.