Clojure defprotocol como uma solução para o problema de expressão

No livro "A Alegria de Clojure",defprotocol é oferecido como uma solução para oexpression problem - "o desejo de implementar um conjunto existente de métodos abstratos para uma classe concreta existente sem precisar alterar o código que define qualquer um."

O exemplo dado é o seguinte:

(defprotocol Concatenatable
  (cat [this other]))

(extend-type String
  Concatenatable
  (cat [this other]
    (.concat this other)))

(cat "House" " of Leaves")
;=> "House of Leaves"

(extend-type java.util.List
  Concatenatable
  (cat [this other]
    (concat this other)))

(cat [1 2 3] [4 5 6])
;=> (1 2 3 4 5 6)

Sugere-se que isso não seja possível em uma linguagem como Java, mas como é diferente do seguint

public class Util {
  public static String cat(final String first,
                           final String second) {
    return first.concat(second);
  }

  public static <T> List<T> cat(final List<T> first,
                                final List<T> second) {
    final List<T> list = new List<T>(first);
    list.addAll(second);
    return list;
  }
}

Afinal, ambos são usados da mesma forma:

(cat "House" " of Leaves")
Util.cat("House", " of Leaves");

A função Clojurecat é a métod noString eList classes, mas sim um @ independenfunçã sobrecarregado para aceitarString ouList argumentos.

Embora eu realmente goste de Clojure, não entendo as reivindicações de superioridade desse construt

questionAnswers(2)

yourAnswerToTheQuestion