【发布时间】:2016-03-30 15:08:08
【问题描述】:
在一个使用 clojure.java.jmx 的项目中,我扩展了它的 Destract 协议 objects->data 函数,以将更多从调用或元数据查询返回的 JMX 数据结构转换为普通的 clojure 数据结构。
当我处理完单个数据结构后,应该可以使用(walk/prewalk jmx/objects->data (jmx/operations "java.lang:type=Threading"))。
但是,在Destract 协议中,objects->data 函数的implementation 类型为clojure.lang.Associative,这意味着映射将被错误地处理。
我可以在我的命名空间中为clojure.lang.IPersistentMap 添加一个实现,但由于clojure.lang.Associative 也是地图的一个接口,所以这不起作用。
因此,我最终不得不分叉 clojure.java.jmx。如果有办法改变偏好,或者为另一个命名空间中的类型撤回协议,我就不必这样做了。
有没有办法防止clojure.lang.Associative 在协议中优先于clojure.lang.IPersistentMap?
如果没有,是否可以为另一个命名空间中的类型撤回协议?是否有可能在协议编译成 Java 接口的方式上实现它?
【问题讨论】:
标签: clojure namespaces clojure-protocol