如果一个对象是多个(无关的)接口的实例,每个接口都扩展了协议,那么将随机选择派发的方法。
(defn reproduce []
(eval
(list 'do
(list 'ns (gensym))
'(do (definterface A)
(definterface B)
(defprotocol P
(a [this]))
(extend-protocol P
A
(a [this] :a)
B
(a [this] :b))
(a (reify A B))))))
(frequencies
(repeatedly 100 reproduce))
;=> {:b 52, :a 48}
一种解决方案是在选择实现之前按名称对接口进行排序,从而至少消除非确定性。在这种情况下,我们还可以进一步打印警告。
登录:https://clojure.atlassian.net/browse/CLJ-2656