2

我正在尝试将一些 Java 代码移植到 Clojure,但遇到了无法解决的情况。

通常,当您想调用带有可变长度参数的 Java 构造函数或方法时,您可以执行以下操作

(Fields. (into-array Comparable ["predict", "other"]))

但是,我发现了一个不起作用的特殊示例:

(Fields. (into-array Comparable ["predict", Double]))

尽管这在 Java 中似乎可行(见下文),但上面的代码给出了以下错误:

IllegalArgumentException array element type mismatch  java.lang.reflect.Array.set (Array.java:-2)

我尝试了几种变体,但似乎没有任何效果。我尝试移植的 Java 代码(以及出现问题的特定行)在这里https://github.com/Cascading/pattern/blob/wip-1.0/pattern-examples/src/main/java/cascading/pattern/ Main.java#L76

new Fields( "predict", Double.class )

(Fields 的构造函数签名是 Fields(Comparable... fields) http://docs.cascading.org/cascading/2.1/javadoc/cascading/tuple/Fields.html#Fields(java.lang.Comparable...)

我在 Clojure repl 中尝试了以下示例:

(into-array Comparable [(type Double)])
(into-array Comparable [Double/TYPE])
(into-array Comparable [Double])
=>
IllegalArgumentException array element type mismatch  java.lang.reflect.Array.set (Array.java:-2)
4

2 回答 2

3

我试图Double.classComparable在 Java 中一样通过并得到了这个:

Line: 4
foo(java.lang.Comparable...) in HelloWorld cannot be applied to (java.lang.String,java.lang.Class<java.lang.Double>)

这是我尝试编译的代码:

public class HelloWorld {
  public static void foo(Comparable... args) {}
  public static void main(String[] args) {
    foo("predict",Double.class);

 }
}
于 2013-05-31T09:21:50.423 回答
0

查看Field级联中的类构造函数代码,我想您应该可以将此特定行移植为:

(into-array Comparable ["predict" 0.0])

于 2013-05-31T16:41:01.537 回答