2

Clojure 允许deftype不完全实现接口的 s,例如

(deftype Foo [x] clojure.lang.ISeq (next [this] x))

Foo不实施seq)。来自 Pythonic 的鸭子类型,或者充其量(或最坏的情况,取决于你的 POV),ABC,我很难理解为什么允许这种不完整的实现,因为我认为接口的目的是保证存在一组方法(现在看来,为了deftype安全地使用其他人的 s,我必须将每个“方法”调用包装在 a 中try...catch)。

4

2 回答 2

1

要求完整的实现会破坏交互式编程。如果有人为您提供了一个没有完全实现 ISeq 的类型,那么他们给了您一个损坏的类型。也就是说,一个 Clojure linter / 分析器检查你的实现疏忽的来源听起来非常有用。

于 2012-05-22T21:34:02.187 回答
1

这是 Clojure 动态语言哲学和 Java 静态语言哲学之间的交集之一。我同意,这确实表明两者之间存在混淆。基本原理是允许 clojure 程序使用 Java 库而没有任何不必要的痛苦,并且许多库要求您传递某个实现方法的类的实例,以解决 Java 缺乏第一类函数的问题。从这个角度来看,这种权衡是有道理的,尽管从其他角度来看,它并不完全符合 Java 哲学。

于 2012-05-22T18:21:44.593 回答