2010-09-06 21 views
14

Chciałbym rzucić obiekt Java clojure (przypisany z let *) do innego typu klasy Java. Czy to możliwe, a jeśli tak, to jak mogę to zrobić?Jak mogę rzucić klasę Java w Clojure?

Aktualizacja: Ponieważ napisałem to pytanie mam sobie sprawę, że nie trzeba rzucać w Clojure, gdyż nie ma koncepcji interfejsu, i jest bardziej jak Ruby kaczka wpisywanie. I tylko trzeba oddać, jeśli trzeba wiedzieć, że obiekt jest na pewno pewnego typu, w tym przypadku mam ClassCastException

+0

Czy możesz podać przykładowy kod, aby zobaczyć, co chcesz osiągnąć? –

+0

Od kiedy to opublikowałem, zdałem sobie sprawę, że nie muszę rzucać, chyba że faktycznie potrzebuję znać typ obiektu. – Zubair

Odpowiedz

15

Jest cast funkcja to zrobić w clojure.core:

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

By sposób, nie powinieneś bezpośrednio używać let* - to tylko szczegół implementacji za let (który powinien być użyty w kodzie użytkownika).

9

Należy pamiętać, że funkcja cast jest tak naprawdę tylko określonym typem asercji. Nie ma potrzeby rzeczywistego rzucania zaklęcia. Jeśli próbujesz uniknąć refleksji, po prostu wpisz podpowiedź:

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]> 
+0

Właściwie twoje prawo, zdałem sobie szybko sprawę, że skoro nie ma pojęć interfejsów, nie jest potrzebne odlewanie – Zubair