Clojure Java Interop错误:非法参数异常:找不到匹配的构造函数

时间:2013-01-28 18:04:17

标签: java constructor clojure

我找到this related question on Stack Overflow,但它并没有真正回答我的问题。

我有一个Java应用程序,我已打包为JAR文件。我还有一个Clojure应用程序,我已打包为JAR文件。我现在正在编写另一个使用前两个作为库的Clojure应用程序。

以下是似乎是我的错误来源的Java代码:

public class ServerBuilder {
  private HashMap<String, ResponseObject> routes = new HashMap<String, ResponseObject>();
  public int limit;
  public ServerSocket serverSocket;
  private ThreadBuilder threadBuilder;
  public int count;

  public ServerBuilder(int limit) {
    this.limit = limit;
  }

  public void begin() throws IOException {
    if(getServerSocket() == null) {
      this.serverSocket = new ServerSocket(4444);
    }
    int count = 0;
    while(count < limit) {
        createThreadBuilder(serverSocket);
        new Thread(threadBuilder).start();
        count = count + 1;
        this.count = count;
    }
  }

然后在我的Clojure代码中,我正在访问我的Java代码:

(ns browser_tic_tac_toe.core
  (:import (server ServerBuilder)))

(defn -main []
  (let [server-builder (ServerBuilder. 100)]   ; the error points me to this line
    (doto
      server-builder (.begin))))

我得到的错误是:

Exception in thread "main" java.lang.IllegalArgumentException: No matching ctor found for class server.ServerBuilder

我用谷歌搜索过这个并没有找到太多东西。该错误显然意味着“没有为此类找到匹配的构造函数”,但在我看来构造函数确实匹配。这就是为什么我很困惑。

修改

我尝试更改我传递的类型(从longint):

(defn -main []
  (let [limit (int 100)
        server-builder (ServerBuilder. limit)]
    (doto
      server-builder (.begin))))

3 个答案:

答案 0 :(得分:4)

与Java相反,我认为clojure中的primitive literalslongs,而非ints,而clojure无法找到构造函数ServerBuilder(long)

答案 1 :(得分:0)

您是否尝试过其他构造函数语法:(new ServerBuilder 100)

否则,也许java代码不在构建路径中 - 或者java类包名称不是server,如编译器错误所示:server.ServerBuilder

答案 2 :(得分:-1)

不确定如何在Clojure中调用Java构造函数,但尝试在Java中创建默认构造函数:

public ServerBuilder()  {
    this.limit = 100;  //some default
}

是的,如果你想将一个参数传递给构造函数,这显然是行不通的。

基于@jtahlborn的另一个答案,您可以使用

将long转换为int

(ServerBuilder. (int 100))

来自http://clojure.org/java_interop#Java Interop-Some optimization tips