【问题标题】:Problems calling a variadic Java function from Clojure从 Clojure 调用可变参数 Java 函数的问题
【发布时间】:2011-08-04 01:22:47
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: java clojure java-7


    【解决方案1】:

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

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

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

    【讨论】:

    • 酷。知道为什么只传递一个字符串参数会导致运行时尝试调用 Paths#get(URI) 方法并将字符串强制转换为 URI 吗?
    • 如果只有一个单参数get 方法,这不会让我感到惊讶。在字节码级别,我想你知道,vararg 版本只是一个带有 String、String[] 的两个 arg 版本。如果你只传递一个对象,编译器可能会说“好吧,只有一个单参数版本,所以我会调用它并希望最好的,而不是浪费时间在反射上看它是否匹配”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多