【问题标题】:Clojure Java Interop Error: Illegal Argument Exception: NO MATCHING CONSTRUCTOR FOUNDClojure Java 互操作错误:非法参数异常:未找到匹配的构造函数
【发布时间】:2013-01-28 18:04:17
【问题描述】:

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

我有一个已打包为 JAR 文件的 Java 应用程序。我还有一个已打包为 JAR 文件的 Clojure 应用程序。我现在正在编写另一个 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

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

编辑

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

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

【问题讨论】:

    标签: java constructor clojure


    【解决方案1】:

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

    【讨论】:

    • Clojure 在使用反射查找匹配项时会在必要时自动将 long 降级为 int,因此这不会产生影响。他可能指的是该类的某个不同版本,它没有整数参数构造函数。
    • @amalloy - 是的,这是我唯一的猜测。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      不确定如何在 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

      【讨论】:

        猜你喜欢
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多