我最近问为什么在 clojure 中不能完全实现接口和协议:
user=> (defprotocol P (foo [self]))
P
user=> (extend-type Long P)
nil
user=> (extends? P Long)
true
user=> (foo 1)
IllegalArgumentException No implementation of method: :foo of protocol: #'user/P found for class: java.lang.Long clojure.core/-cache-protocol-fn (core_deftype.clj:527)
并被告知这是出于互操作的原因,实际上这不会成为问题。当然。
但显然extends?
真的没有告诉我协议和类之间的关系:正如(extends? P C)
并不意味着我可以调用foo
C 类的对象,(not (extends? P C))
也不意味着我不能调用foo
C 类的对象:
user=> (defprotocol P (foo [self]))
P
user=> (extend-type Object P (foo [self] 1))
nil
user=> (extends? P Long)
false
user=> (foo 1)
1
现在我很困惑extends?
应该给我什么信息...... satisfies?
另一方面,正确处理第二种情况,但不是第一种。