感谢帮助发布问题!
为了提供更多上下文,我注意到,由于生成的函数是动态类型的,因此 defprotocol
会根据相同的元数据生成一个有效的接口,因为这些标签仅作为类型提示放置在协议映射中。
user=> (defprotocol PFoo (^String/1 bar [this]))
PFoo
user=> (reify user.PFoo (bar [this] :ok))
#object[user$eval196$reify__197 0x64a9d48c "user$eval196$reify__197@64a9d48c"]
user=> (bar *1)
:ok
user=> (first (.getMethods (:on-interface PFoo)))
#object[java.lang.reflect.Method 0x35178483 "public abstract java.lang.Object user.PFoo.bar()"]
尽管这产生了一个不可读的符号,看起来也是同样错误的。
user=> (:sigs PFoo)
{:bar {:tag [Ljava.lang.String;, :name bar, :arglists ([this]), :doc nil}}
user=> (get-in PFoo [:sigs :bar :tag])
[Ljava.lang.String;
user=> (class *1) ; oh no
clojure.lang.Symbol