1

Clojureプロトコルがあるとします。

(defprotocol Foo
  (bar [x]))

私は、このプロトコルが(extend-protocolまたはでextend-type)多くのJavaクラスおよび/またはインターフェースに拡張された可能性があることを知っています。

Foo実行時に拡張されたクラスのリストを取得するにはどうすればよいですか?

4

3 に答える 3

2

参照。extendersそしてSOは私にもっと文字を入力してほしいと思っています。

于 2013-02-19T10:01:46.603 に答える
2

例に示すように、プロトコルはマップ データ構造として実装されます。

user=> (defprotocol Foo (bar [x]))
Foo
user=> Foo
{:on-interface user.Foo, :on user.Foo, :sigs {:bar {:doc nil, :arglists ([x]), :name bar}}, :var #'user/Foo, :method-map {:bar :bar}, :method-builders {#'user/bar #<user$eval331$fn__332 user$eval331$fn__332@cdd54e>}}
user=> (extend-protocol Foo String (bar [x] x))
nil
user=> Foo
{:impls {java.lang.String {:bar #<user$eval350$fn__351 user$eval350$fn__351@25bd56>}}, :on-interface user.Foo, :on user.Foo, :sigs {:bar {:doc nil, :arglists ([x]), :name bar}}, :var #'user/Foo, :method-map {:bar :bar}, :method-builders {#'user/bar #<user$eval331$fn__332 user$eval331$fn__332@cdd54e>}}

したがって、使用できるプロトコルの実装を取得するには、次のようにします。 (Foo :impls)

于 2013-02-18T08:28:58.677 に答える
-1

対処するケースは2つ

  • extend-typeextend-protocol
  • deftypedefrecord

これに関する回答については、https://stackoverflow.com/a/14261880/1756702を参照してください。

于 2013-02-18T08:28:53.050 に答える