列出Clojure协议已扩展到的类/接口

时间:2013-02-18 08:22:06

标签: java clojure protocols

假设我有一个Clojure协议:

(defprotocol Foo
  (bar [x]))

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

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

比照extenders并且SO要我输入更多字符。

答案 2 :(得分:-1)

有两种情况需要处理

  • extend-typeextend-protocol
  • deftypedefrecord

请参阅https://stackoverflow.com/a/14261880/1756702以获得有关此问题的答案。