如何在Clojure中处理特定情况的Java变量长度参数?

时间:2013-05-31 08:38:57

标签: java clojure interop cascading

我正在尝试将一些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)

2 个答案:

答案 0 :(得分:3)

我试图将Double.class作为Comparable传递给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);

 }
}

答案 1 :(得分:0)

在级联中查看Field类构造函数代码我猜你应该可以将这个特定行移植为:

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