Как я могу использовать класс Java в Clojure?

Я хотел бы добавить объект Java clojure (назначенный с let *) в другой тип класса Java. Возможно ли это, и если да, то как я могу это сделать?

Обновление: Поскольку я разместил этот вопрос, я понял, что мне не нужно вводить clojure, поскольку он не имеет понятия интерфейса и больше похож на Ruby duck typing. Мне нужно всего лишь бросить, если мне нужно знать, что объект определенно определенного типа, и в этом случае я получаю ClassCastException

Ответы

Ответ 1

В clojure.core есть функция cast:

user> (doc cast)
-------------------------
clojure.core/cast
([c x])
  Throws a ClassCastException if x is not a c, else returns x.

Кстати, вы не должны использовать let* напрямую - это просто деталь реализации за let (что и должно использоваться в коде пользователя).

Ответ 2

Обратите внимание, что функция cast - это действительно только определенный тип утверждения. Нет необходимости в фактическом литье в clojure. Если вы пытаетесь избежать отражения, просто наберите:

user=> (set! *warn-on-reflection* true)
true
user=> (.toCharArray "foo")  ; no reflection needed
#<char[] [[email protected]>
user=> (defn bar [x]         ; reflection used
         (.toCharArray x))
Reflection warning, NO_SOURCE_PATH:17 - reference to field toCharArray can't be resolved.
#'user/bar
user=> (bar "foo")           ; but it still works, no casts needed!
#<char[] [[email protected]>
user=> (defn bar [^String x] ; avoid the reflection with type-hint
         (.toCharArray x)) 
#'user/bar
user=> (bar "foo")
#<char[] [[email protected]>