java - 从 Clojure 调用可变参数 Java 函数时出现问题

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

有什么想法吗?

最佳答案

如您所见,它不需要 Object[],它需要 String[]。 object-array 完全按照它所说的去做:它创建了一个对象数组。如果你想创建一个不同类型的数组,make-arrayinto-array 是你的 friend 。例如这里:

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

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

关于java - 从 Clojure 调用可变参数 Java 函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638541/

相关文章:

java.lang.NoClassDefFoundError Google Vision API android

java - 删除 JAXB 中的前导/尾随空格?

hadoop - Cascalog Hadoop 版本支持

java - 有什么理由更喜欢数据挖掘项目的函数式编程吗?

java-7 - AIX 操作系统上的 JDK 1.7

java - 是否可以在 JUnit 中设置测试类的方法的返回值?

java - Android Realm Arraylist 和简单的 POJO

clojure - 来自 clojure 的 clojurescript 的命名空间问题是什么?

java - JDK 日期/时间的问题是否已修复,或者是否仍被视为已损坏?

java - IntelliJ 使用 Java 8 SDK 为 Java 7 JRE 编译