Ответ 1
Исключительная причина, о которой я знаю, - это производительность. Тип подсказки в clojure удаляет отражение, что может замедлить производительность. Поэтому я бы поставил типы подсказок в функции, которые, как я оценил, были критичными по производительности.
В разделе java interop в clojure.org есть описание ,. Среди замечаний:
Clojure поддерживает использование подсказок типа, чтобы помочь компилятору избежать отражения в критически важных областях кода. Как правило, следует избегать использования типов подсказок, пока не появится известное узкое место производительности.
... После того, как подсказка типа была помещена в идентификатор или выражение, компилятор попытается разрешить любые вызовы методам после этого во время компиляции. Кроме того, компилятор будет отслеживать использование любых возвращаемых значений и выводить типы для их использования и т.д., Поэтому требуется очень мало советов, чтобы получить полностью разрешенную во время компиляции серию вызовов. Обратите внимание, что подсказки типа не нужны для статических членов (или их возвращаемых значений!), Поскольку у компилятора всегда есть тип для статики.
Вы всегда можете включить предупреждающий флаг отражения, чтобы увидеть, где вызывается отражение, и, следовательно, подсказки типа могут помочь.
EDIT:
Относительно вашего вопроса "Только для java interop?" --no. Тип подсказок будет полезен даже в чистом приложении clojure. Проблема замедления производительности отражения - это факт жизни на JVM, и это проблема, с которой приходится сталкиваться с динамическими языками в целом.
Относительно того, где могут быть размещены подсказки типов, от clojure.org:
Они могут быть помещены на функциональные параметры, имена с привязкой, имена переменных (если они определены) и выражения: