【问题标题】:Using java.nio.Paths raises weird exception in Clojure在 Clojure 中使用 java.nio.Paths 会引发奇怪的异常
【发布时间】:2015-12-16 14:15:14
【问题描述】:

我正在尝试使用 Paths 类中的静态方法并收到以下消息:

user=> (java.nio.file.Paths/get "/tmp" "test.db")
ClassCastException java.lang.String cannot be cast to [Ljava.lang.String;  hacking-capital.core/eval8240 (form-init317418023117164331.clj:1)

它应该根据javadoc 工作,但没有。为什么? 我正在使用 Java HotSpot(TM) 64 位服务器 VM 1.8.0_66-b17、Linux 上的 Clojure 1.7.0

【问题讨论】:

  • 我的猜测是第二个参数需要是一个数组。也许像(java.nio.file.Paths/get "/tmp" (into-array String ("test.db))
  • String... more 是一个 vargs 参数,其处理方式类似于数组。 @assylias 已经提到过
  • 你说的都对:(java.nio.file.Paths/get "/tmp" (into-array String ["test.db"])) #object[sun.nio.fs.UnixPath 0x6099a03 "/tmp/test.db"]

标签: java clojure interop


【解决方案1】:

方括号字符表示一个数组,因此该方法需要一个字符串数组

[Ljava.lang.String;

Java API 显示 Paths.get() 接受可变数量的 String 参数,但在幕后,这意味着该方法接受一个数组。我猜 Clojure 没有将 String 参数必要的绑定到一个数组中。

这个tutorial 表明必须编写Java 方法来处理参数数组。换句话说,javac 编译器处理可变数量的参数是为了方便。

【讨论】:

  • 我发现奇怪的是Java中的vargs被理解为arg 数组只是Clojure中的数组。因此,如果不提及这个怪癖,您的答案似乎是不完整的。
  • 尼尔,你的意思是第一行中的“字符串数组”,对吧?
猜你喜欢
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多