6

JDK7のJavaNIO.2APIを試してみました。

特に、メソッドを呼び出したいと思います。Paths#get(String first, String... more)

これは、少なくとも1つの文字列を受け取り、それに対応する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;

ご想像のとおり。結局のところ、String[]を期待しているものにObject[]を渡しているのです。

(object-array)フォームを削除しようとしましたが、Clojureがタイプヒントの有無にかかわらずget(URI)メソッドを呼び出そうとするだけです。

Paths#get(String、String ...)の2番目の引数としてnilを渡すと、正しいメソッドが呼び出されますが、Java7はNPEで失敗します。

ClojureでString[]型を表現する方法を見つけることができないようです-それを行うか、ディスパッチシステムにヒントを提供する必要があると思います。

何か案は?

4

1 に答える 1

16

お気づきのように、Object []は必要なく、String[]が必要です。object-arrayそれが言うことを正確に行います:それはオブジェクトの配列を作ります。いくつかの異なるタイプの配列を作成したい場合、make-arrayそしてinto-arrayあなたの友達です。たとえば、ここで:

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

このString場合、指定子はオプションです。配列の目的の型を省略した場合、Clojureは最初のオブジェクトの型を配列のコンポーネント型として使用します。

于 2011-04-12T16:34:50.797 に答える