6

我正在玩 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[] 的东西。

我试过删除 (object-array) 表单——但这只会导致 Clojure 尝试调用 get(URI) 方法——无论有没有类型提示。

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

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

有任何想法吗?

4

1 回答 1

16

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

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

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

于 2011-04-12T16:34:50.797 回答