2010-09-06 12 views
14

Ich möchte ein Clojure-Java-Objekt (mit * vergeben) in einen anderen Java-Klassentyp umwandeln. Ist das möglich und wenn ja, wie kann ich das tun?Wie kann ich eine Java-Klasse in Clojure umwandeln?

Update: Seit ich diese Frage gestellt habe, habe ich festgestellt, dass ich nicht in Clojure caste, da es kein Konzept einer Schnittstelle hat, und eher Ruby Duck Typisierung ist. Ich brauche nur zu werfen, wenn ich wissen muss, dass ein Objekt auf jeden Fall eines bestimmten Typs ist, in welchem ​​Fall ich eine Classcast

+0

Können Sie einen Beispielcode posten, um zu sehen, was Sie erreichen möchten? –

+0

Seit ich das gepostet habe, habe ich gemerkt, dass ich nicht casten muss, außer ich muss tatsächlich den Typ eines Objekts kennen. – Zubair

Antwort

15

Es gibt eine cast Funktion zu tun, dass in clojure.core:

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

von Übrigens sollten Sie let* nicht direkt verwenden - es ist nur ein Implementierungsdetail hinter let (was im Benutzercode verwendet werden sollte).

9

Beachten Sie, dass die cast-Funktion wirklich nur eine bestimmte Art von Assertion ist. In clojure ist kein tatsächliches Casting erforderlich. Wenn Sie versuchen, Reflexionen zu vermeiden, geben Sie einfach folgenden Tipp ein:

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

Eigentlich recht, merkte ich recht bald, dass es keine Notwendigkeit für Interfaces gibt – Zubair

Verwandte Themen