Старый вопрос, и есть принятый ответ ... однако я, возможно, сделал бы что-то вроде этого:
(defprotocol FooP
(foo [this]))
(defrecord Foo []
FooP
(foo [this] :whatever))
если вы знаете протокол, который вы хотите проверить, тогда вы можете использовать satisfies?
> (satisfies? FooP (->Foo))
true
Если нет, то вы могли бы по крайней мере найти все интерфейсы, используя следующее
(defn interfaces [o]
(for [interface (.getInterfaces (class o))]
(.getCanonicalName ^Class interface)))
который вы можете проверить
> (interfaces (->Foo))
("com.beoliver.FooP" "clojure.lang.IRecord" "clojure.lang.IHashEq" "clojure.lang.IObj" "clojure.lang.ILookup" "clojure.lang.IKeywordLookup" "clojure.lang.IPersistentMap" "java.util.Map" "java.io.Serializable")
> (interfaces [])
("clojure.lang.IObj" "clojure.lang.IEditableCollection" "clojure.lang.IReduce" "clojure.lang.IKVReduce")
> (interfaces {})
("clojure.lang.IObj" "clojure.lang.IEditableCollection" "clojure.lang.IMapIterable" "clojure.lang.IKVReduce")
Если вы отобразите bean
через интерфейсы, не вызывая .getCanonicalName
, вы сможете увидеть все опции.