Clojure 允许 deftype
不完整地实现接口(interface),例如
(deftype Foo [x] clojure.lang.ISeq (next [this] x))
( Foo
未实现 seq
)。来自鸭子类型的 Pythonic 领域,或者充其量(或最坏,取决于你的 POV)ABC,我很难理解为什么允许这种不完整的实现,因为我认为接口(interface)的要点是保证存在一组方法(现在看来,为了安全地使用其他人的 deftype
,我必须将每个“方法”调用包装在 try...catch
中)。
最佳答案
这是 Clojure 动态语言哲学和 Java 静态语言哲学之间的交叉点之一。我同意,这确实表明了两者之间的混淆点。其基本原理是允许 clojure 程序使用 Java 库而不会造成任何不必要的痛苦,并且许多库要求您通过获取传递实现方法的某个类的实例围绕 Java 缺乏一流的功能。从这个角度来看,这种权衡是有道理的,尽管从其他角度来看,它不太符合 Java 哲学。
关于interface - clojure 中接口(interface)的不完整实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10707534/