似乎有一个奇怪的特殊情况,文档(明确地)没有涵盖:协议直接实现时,元数据实现并没有获胜,但并没有提供直接的实现。
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()'。
另一方面,如果元数据实现缺失,它会默认到扩展实现。当前文档的措辞似乎没有使这种差异明显(但显然都是为了保持快速路径)。