I recently asked why interfaces and protocols could be incompletely implemented in 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) and was told that this was for interop reasons and that it wouldn't be a problem in practice. Sure.
But apparently extends? really tells me nothing about the relationship between a protocol and a class: just as (extends? P C) does not imply that I can call foo on objects of class C, (not (extends? P C)) does not imply that I cannot call foo on objects of class 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 Now I am very confused about what information extends? is supposed to give me... satisfies?, on the other hand, handles the second case correctly, but not the first one.