Другие правы в том, что Clojure не обеспечивает типы элементов в возвращаемых коллекциях и т. Д. (На самом деле, JVM также не обеспечивает типы элементов в коллекциях - это полностью обрабатывается javac.)
Однако я вижу ценность предоставления API другим программистам на Java, которое определяет интерфейс, который объявляет, что возвращаемые значения (или параметры) параметризованы различными способами;это особенно привлекательно, если кто-то хочет использовать Clojure в существующей среде Java без создания волн.
В настоящее время требуется двухэтапный процесс:
- определяет отдельный интерфейс (в Java!) который задает параметризованные типы так, как вам нравится
- определяет ваше
gen-class
пространство имен (или proxy
или reify
экземпляр) таким образом, что он реализует этот интерфейс
(Clojureдействительно предоставляет форму definterface
, которая позволит вам избежать отдельного определения интерфейса Java, но definterface
, как и остальная часть Clojure, не предусматривает указание параметризованных типов. Может быть, когда-нибудь ...: -))
например,
public interface IFoo {
List<TypedObject> createListOfTypedObjects ();
}
, а затем ваше пространство имен gen-класса:
(ns your.ns.FooImpl
(:gen-class
:implements [IFoo]))
(defn -createListOfTypedObjects
[]
[typedObj1, typedObj2, typedObj3])
Когда ваши пользователи создают экземпляры FooImpl
, они, например, получат завершение кода, указывающее, чтометод возвращает List<TypedObject>
, а не Object
или непараметризованный тип List
.
Если вы используете нормальные инструменты сборки (например, maven , gradle или правильно настроенный муравей),затем вы можете поместить Java-интерфейс в ваш проект Clojure, и о межъязыковой зависимости позаботятся.