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



我正在使用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[]类型的方法-我猜我要么需要这样做,要么向调度系统提供提示。

任何想法?

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

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

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