2010-09-06 15 views
14

Me gustaría lanzar un objeto Java clojure (asignado con let *) a otro tipo de clase Java. ¿Es esto posible? Si es así, ¿cómo puedo hacer esto?¿Cómo puedo lanzar una clase de Java en Clojure?

Actualización: Desde que publiqué esta pregunta, me he dado cuenta de que no necesito echar Clojure ya que no tiene un concepto de interfaz, y es más parecido a Ruby duck typing. Sólo necesito echar si necesito saber que un objeto es, sin duda de un cierto tipo, en cuyo caso me sale un ClassCastException

+0

¿Puede publicar un código de muestra para ver lo que quiere lograr? –

+0

Desde que publiqué esto, me di cuenta de que no necesito transmitir a menos que realmente necesite saber el tipo de objeto – Zubair

Respuesta

15

Hay una función cast hacer eso en clojure.core:

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

Por De la misma manera, no debe usar let* directamente; es solo un detalle de implementación detrás de let (que es lo que se debe usar en el código de usuario).

9

Tenga en cuenta que la función cast es realmente solo un tipo específico de aserción. No hay necesidad de lanzar en clojure. Si está tratando de evitar la reflexión, simplemente escriba la sugerencia:

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

En realidad, es su derecho, me di cuenta bastante pronto de que no hay nociones de interfaces que no sean necesarias. – Zubair

Cuestiones relacionadas