似乎存在一个奇特的边缘情况,这在文档中没有(明确)涉及:如果协议是直接实现的,但没有提供直接实现,则元数据实现不会获胜。
Clojure 1.10.3
user=> (defrecord MissingDirect [] A)
user.MissingDirect
user=> (foo (with-meta (->MissingDirect) {`foo (fn [_] :meta)}))
执行错误(AbstractMethodError)在 user/eval208 (REPL:1)。
接收器类 user.MissingDirect 没有定义或继承接口 user.A 中解析出的方法 'abstract java.lang.Object foo()' 的实现。
然而,如果元数据实现缺失,则默认为扩展实现。文档的当前措辞似乎并没有使这种差异明显(但显然这全部是为了保持快速路径)。