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