从Clojure调用可变参数Java函数的问题

时间:2011-04-12 16:26:29

标签: java clojure java-7

我正在使用JDK 7中的Java NIO.2 API。

特别是,我想调用方法:Paths#get(String first, String... more)

这是一个静态方法,它至少接收一个字符串,并返回与之对应的Path对象。有一个重载的表单:Paths#get(URI uri)

但是,我似乎无法从Clojure调用top方法。我最近能得到的是:

(Paths/get ^String dir-fq (object-array 0))

失败了:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
正如您所料,

毕竟,我们将Object []传递给期望String []的东西。

我尝试删除(对象数组)表单 - 但这只会导致Clojure尝试调用get(URI)方法 - 无论是否有类型提示。

将nil作为第二个参数传递给Paths #get(String,String ...)会导致调用正确的方法,但Java 7会因NPE而失败。

我似乎无法在Clojure中找到表达String []类型的方法 - 我猜我需要这样做或者为调度系统提供提示。

有什么想法吗?

1 个答案:

答案 0 :(得分:16)

正如您所注意到的,它不需要Object [],它需要String []。 object-array正如它所说的那样:它创建一个对象数组。如果您想创建一个具有不同类型的数组,make-arrayinto-array是您的朋友。例如:

(Paths/get "foo" (into-array String ["bar" "baz"]))

在这种情况下String说明符是可选的:如果省略数组所需的类型,Clojure使用第一个对象的类型作为数组的组件类型。