1

假设我有一个 Clojure 协议:

(defprotocol Foo
  (bar [x]))

我知道这个协议可能已经(使用extend-protocolextend-type)扩展到许多 Java 类和/或接口。

如何获取Foo在运行时扩展的类的列表?

4

3 回答 3

2

参看。extenders所以希望我输入更多字符。

于 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

有两种情况需要处理

  • extend-typeextend-protocol
  • deftypedefrecord

有关讨论此问题的答案,请参阅https://stackoverflow.com/a/14261880/1756702

于 2013-02-18T08:28:53.050 回答