Я удивлен, что не нашел вопросов по этой теме, о переполнении стека, и еще более удивлен, увидев, что официальная документация по добавлению подсказок типов не покрывает это - я был уверен, что смогу закрыть это какдубликат или ссылка на официальную документацию, но здесь я набираю ее от руки, как варвар.
«Примитивная» версия подсказки типа, для которой другие формы являются просто сокращением 1 , это
^"Foo" xs
, где Foo - это внутреннее имя JVM для класса, который вы хотите намекнуть. Существуют сокращения для примитивных массивов (^ints xs
) и для обычных типов классов (^MyType x
), но это не распространяется на массивы не примитивных типов. Для этого вы должны знать официальное имя класса для вашего типа. Вы можете найти правила для этого, но самое простое, что нужно сделать, это просто спросить переводчика!
user=> (defrecord Foo [])
user.Foo
user=> (def foos (make-array Foo 10))
#'user/foos
user=> (class foos)
[Luser.Foo;
user=> (aget foos 0)
Reflection warning, null:1:1 - call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).
nil
user=> (aget ^"[Luser.Foo;" foos 0)
nil
1 На самом деле, еще более примитивным является ^{:tag "Foo"}
, но этоРазличие не имеет значения для этого вопроса.