【问题标题】:Call overloaded Java method in Clojure with string array使用字符串数组在 Clojure 中调用重载的 Java 方法
【发布时间】:2015-09-07 12:47:49
【问题描述】:

给定这个类和重载的方法:

public class MyClass {
    public MyClass(){}
    public String foo(string a, boolean b) { return "bool: " + i; }
    public String foo(string a, String... values) { return "strarray: " + values; }
}

我们想用第二个参数调用 foo。我们用类型提示尝试了很多次迭代,但我仍然无法让它调用 strarray 方法。

这是我们尝试进入数组时得到的数组:

IllegalArgumentException No matching method found: setParam for class xxx  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)

如何在 clojure 中做到这一点?

【问题讨论】:

标签: java clojure overloading clojure-java-interop


【解决方案1】:

调用看起来像这样:

(.foo (MyClass.) 
      "first argument" 
      (into-array String  ["second" "and third"]))

【讨论】:

  • 这似乎导致了这个异常。我错过了什么吗? IllegalArgumentException 数组元素类型不匹配 java.lang.reflect.Array.set (Array.java:-2) pp.webservice.server=> (.printStackTrace *e) java.lang.IllegalArgumentException: java.lang 的数组元素类型不匹配。 reflect.Array.set(Native Method) at clojure.lang.RT.seqToTypedArray(RT.java:1638) at clojure.core$into_array.invoke(core.clj:3097) at test$testme.invoke(test.clj: 31
  • 如果不运行您的确切代码很难知道,但您需要确保 clojure seq 中的所有类型都是您在 in-array 调用中声明的类型。例如: (Paths/get "/usr/" (into-array String ["tim"])) 有效。并且 (Paths/get "/usr/" (into-array String ["tim" 1])) 抛出 IllegalArgumentException 数组元素类型不匹配 java.lang.reflect.Array.set (Array.java:-2)。
  • 是的,就是这样。谢谢!
【解决方案2】:

你可以先拼接字符串,然后返回相同的

public class Demo {
    public String foo(String... values) {
        String value = "";
        for (int i = 0; i < values.length; i++) {
            value += values[i]+" ";
        }
        return "strarray: " + value;
    }
    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println(demo.foo("ABCD", "PQRS","XYZW"));
    }
}

输出: strarray: ABCD PQRS XYZW

【讨论】:

  • 感谢您的回答,尽管 user3833320 在 Clojure 中要求回答。
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2013-11-03
  • 2016-06-15
  • 1970-01-01
  • 2011-08-28
  • 2017-06-10
相关资源
最近更新 更多