Как я могу привести класс Java в Clojure? - PullRequest
15 голосов
/ 06 сентября 2010

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

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

Ответы [ 2 ]

16 голосов
/ 06 сентября 2010

В 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 (что и должно использоваться в коде пользователя).

10 голосов
/ 06 сентября 2010

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

user=> (set! *warn-on-reflection* true)
true
user=> (.toCharArray "foo")  ; no reflection needed
#<char[] [C@a21d23b>
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[] [C@34e93999>
user=> (defn bar [^String x] ; avoid the reflection with type-hint
         (.toCharArray x)) 
#'user/bar
user=> (bar "foo")
#<char[] [C@3b35b1f3>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...