7

Java プリミティブ配列を処理するために Clojure プロトコルを拡張したいと考えています。

(defprotocol PVectorisable
  (to-vector [a]))

(extend-protocol PVectorisable
  ??????
    (to-vector [coll]
      (Vectorz/create ^doubles coll))
  java.util.List
    ... other implementations......)

これは可能ですか? もしそうなら、上記の拡張プロトコル定義に何を入れる必要がありますか (「??????」の代わりに)?

4

2 に答える 2

12

最も簡単な解決策は、おそらくリフレクションを使用してプログラムでクラスを取得することです。

(defprotocol do-a-thing
 (print-thing [thing]))

(extend-protocol do-a-thing
 (class (float-array 0))
  (print-thing [_]
   (println "it's a float array")))

Java の配列にはいくつかの奇妙な名前が付いています。たとえば、float 配列は[F. それを REPL で直接使用しようとすると、 unmatched で詰まるでしょう[。ただし、この名前は、たとえばClass/forName.

(defprotocol do-another-thing
 (print-another-thing [thing]))

(extend-protocol do-another-thing
 (Class/forName "[F")
  (print-another-thing [_]
   (println "it's still a float array")))

この記事では、配列クラスについて詳しく説明します。

于 2012-12-18T02:01:55.360 に答える