从 Clojure 调用 Java 重载方法 Path.of 时出错

问题描述 投票:0回答:2

我是 Clojure 和学习的新手。我正在尝试使用

Path
方法在 Clojure 中创建一个 java
Path.of()
对象,但是当我调用此

(import '(java.nio.file Path))
(Path/of "~/projects")

我收到错误

; Execution error (ClassCastException) at prog-clojure.2/eval10600 (form-init5937344406109919668.clj:34).
; class java.lang.String cannot be cast to class java.net.URI (java.lang.String and java.net.URI are in module java.base of loader 'bootstrap')

当我看到 of

java.nio.file.Path
方法的
javadoc
时,它是重载方法。有两种方法

  • static Path of(String first, String... more)
    
  • static Path of(URI uri)
    

我尝试了不同的通话方式,例如

(. Path of "~/projects")

但得到同样的错误。

理想情况下它应该返回一个

Path
对象。我该如何解决这个问题?

clojure clojure-java-interop
2个回答
0
投票

方法

static Path of(String first, String... more)
是一个 vararg 方法。当调用 vararg 方法时,将构造一个数组并传递给 vararg 参数,这是在 Java 中隐式完成的。

但是在 Clojure 中,您必须显式地向其传递一个(可能为空)数组!

user=> (Path/of "~/projects" (into-array String []))
#object[sun.nio.fs.UnixPath 0xc9d82f9 "~/projects"]

0
投票

是的,您的代码正在调用函数的单参数,这需要 URI 作为参数。要调用将字符串作为第一个参数的函数,您需要传递第二个参数,它是一个字符串数组。在你的情况下,你希望该参数为空。所以,像这样:

(java.nio.file.Path/of "~/Documents" (make-array String 0))
-> #object[sun.nio.fs.UnixPath 0x7447da74 "~/Documents"]
© www.soinside.com 2019 - 2024. All rights reserved.