我是 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
对象。我该如何解决这个问题?
方法
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"]
是的,您的代码正在调用函数的单参数,这需要 URI 作为参数。要调用将字符串作为第一个参数的函数,您需要传递第二个参数,它是一个字符串数组。在你的情况下,你希望该参数为空。所以,像这样:
(java.nio.file.Path/of "~/Documents" (make-array String 0))
-> #object[sun.nio.fs.UnixPath 0x7447da74 "~/Documents"]