似乎有一个奇怪的边缘情况未在文档中(明确)说明:如果协议直接实现,但没有提供直接实现,元数据实现不会获胜。
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()' 的实现。
然而,如果元数据实现缺失,则默认到扩展实现。文档的当前表述似乎并没有明确说明这种差异(但显然这些都是为了保留快速路径)。