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

kit*_*yst 6 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))
Run Code Online (Sandbox Code Playgroud)

失败的是:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

正如你所料.毕竟,我们将Object []传递给期望String []的东西.

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

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

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

有任何想法吗?

ama*_*loy 16

正如您所注意到的,它不需要Object [],它需要String [].object-array完全按照它说的做:它创建一个对象数组.如果你想创建一个不同类型的数组,make-array并且into-array是你的朋友.例如这里:

(Paths/get "foo" (into-array String ["bar" "baz"]))
Run Code Online (Sandbox Code Playgroud)

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