我以clojure site为例。
(defmulti foo class)
(defmethod foo ::collection [c] :a-collection)
(defmethod foo String [s] :a-string)
(foo [])
:a-collection
(foo (java.util.HashMap.))
:a-collection
(foo "bar")
:a-string
此功能很棒。我试图了解技术原因,为什么它优于(例如)java中基于实例的实现。在我看来,函数在本质上与更好的语法等效。
public <T> String foo(final T t) {
if (t instanceof Collection) {
return "a-collection";
} else if (t instanceof String) {
return "a-string";
} else {
throw new IllegalArgumentException("Undefined - no available dispatch");
}
}
为什么多方法被认为是基于访问者模式的双重调度的绝佳替代方法,而instanceof却不是在看来它们实际上在做相同的事情,是什么原因呢?