Clojure protocols上的文档声明为每个协议生成了相应的Java接口。但是,你可以用协议做的事情(将它们扩展到任意类型等)看起来不像是在Java接口方面有直接实现的东西。协议和协议方法如何在内部工作?为什么以及如何使用每个协议的Java接口?
答案 0 :(得分:5)
对Clojure平台源代码的简要介绍揭示:
Class
映射到Clojure函数,该函数实现了Class
的协议。 (它实际上是一个名为MethodImplCache
的自定义类的实例。)Class
并在哈希表中进行查找。Class
,以便下次可以直接找到它。Class
及其对应的方法实现都缓存在实例变量中,如果调度Class
相同,则用于绕过哈希查找下一次。MethodImplCache
解析对协议方法的调用。reify
获取扩展协议的匿名类的实例时,或者使用deftype
或{{1}时,会使用生成的接口 创建一个扩展协议的新类。在任何一种情况下,您都将获得实现生成的接口的defrecord
对象。这似乎意味着当扩展到任意类时,协议方法调用应该比普通的Clojure函数调用慢。如果您将协议内联扩展,而不是单独调用Class
或{{1},那么与reify
/ deftype
/ defrecord
一起使用时的效果会更好}}