Как я могу использовать класс 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]>