由于def形式的编译实现细节,其参数中的调用使用applyTo而不是直接使用invoke方法来评估。这迫使IFn的实现者即使在不需要的情况下也必须实现applyTo。
建议的补丁将InvokeExpr.eval更改为使用AFn.applyToHelper,以便在可能的情况下使用invoke而不是applyTo。
当前失败的代码示例(带有补丁将可行)
user=> (deftype x [] clojure.lang.IFn (invoke [_] 1)) user.x user=> (def a ((x.))) 抽象方法错误 clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3553)