Thank you for that. I've found that the code works correctly if I just copy it into the repl and run it; it's only when I load it in Eclipse (with Counterclockwise) using ctrl-alt-s that it displays the error. Is there some way to reset the repl to a blank state (remove all previous class definitions) other than just closing and re-opening it?
On Wednesday, 22 January 2014 12:11:07 UTC+11, Stuart Sierra wrote: > > Hello Jonathan, > > In my experience, an error along the lines of "class Foo cannot be cast to > Foo" is usually caused by re-evaluating class definitions, either by > reloading files or by re-evaluating definitions in your REPL or IDE. > > Here is a smaller example that demonstrates the problem: > > (deftype Foo [x]) > > (def a-foo (Foo. 1)) > > (defn use-foo [^Foo foo] > (prn (.x foo))) > > ;; Re-evaluate the definition of Foo, > ;; perhaps in a REPL or editor: > (deftype Foo [x]) > > (type a-foo) ;;=> user.Foo > > (= Foo (type a-foo)) ;;=> false > > (use-foo a-foo) > ;; java.lang.ClassCastException: > ;; user.Foo cannot be cast to user.Foo > > The object `*a-foo*` is an instance of the **first** definition of the > type Foo, which was overwritten by the **second** definition of the type > Foo. > > This problem is caused by a combination of Clojure's runtime generation of > Java classes and the way JVM ClassLoaders work. > > -S > > > > On Sunday, January 19, 2014 9:20:03 PM UTC-5, Jonathan Barnard wrote: >> >> For fun, I've been porting a very simple particle animation from Java to >> Clojure. It was somewhat slow so to see how fast I could make it I decided >> to try using mutation. I've defined a Particle type, and a PSlice type that >> contains an array of objects and a length (number of non-nil objects in the >> slice), but when I try to provide type hints for this slice type, I get the >> error: >> >> *ClassCastException MyProject.core.PSlice cannot be cast to * >> >> *MyProject.core.PSlice *Is this a bug, or am I doing something wrong? My >> code defining the two types is: >> >> (definterface IPt >> (^Double gx []) (^Double gy []) (^Double gz []) (^Double gvx []) >> (^Double gvy []) (^Double gvz []) (^Double gR []) (^Double glife []) >> (^Boolean gis []) >> (sx [^Double v]) (sy [^Double v]) (sz [^Double v]) (svx [^Double v]) >> (svy [^Double v]) (svz [^Double v]) (sR [^Double v]) (slife [^Double v]) >> (^Boolean sis [^Boolean v])) >> >> (deftype Particle [^:unsynchronized-mutable ^Double x >> ^:unsynchronized-mutable ^Double y ^:unsynchronized-mutable ^Double z >> ^:unsynchronized-mutable ^Double vx >> ^:unsynchronized-mutable ^Double vy ^:unsynchronized-mutable ^Double vz >> ^:unsynchronized-mutable ^Double R >> ^:unsynchronized-mutable ^Double life ^:unsynchronized-mutable ^Boolean is] >> IPt >> (gx [_] x) (gy [_] y) (gz [_] z) (gvx [_] vx) (gvy [_] vy) (gvz [_] vz) >> (gR [_] R) (glife [_] life) (gis [_] is) >> (sx [this v] (set! x v)) (sy [this v] (set! y v)) (sz [this v] (set! z >> v)) >> (svx [this v] (set! vx v)) (svy [this v] (set! vy v)) (svz [this v] >> (set! vz v)) >> (sR [this v] (set! R v)) (slife [this v] (set! life v)) (sis [this v] >> (set! is v))) >> >> (definterface ISlice >> (^Long gLen []) >> (sLen [^Long x]) >> (^Particle gPt [^Long n]) >> (sPt [^Long n ^Particle pt] )) >> >> (deftype PSlice [^"[Ljava.lang.Object;" pts ^:unsynchronized-mutable >> ^Long len] >> ISlice >> (gLen [_] len) >> (sLen [this new-len] (set! len new-len)) >> (gPt [this n] (aget pts n)) >> (sPt [this n pt] (aset pts n pt))) >> >> >> Then the error occurs if I define a PSlice, such as by: >> >> (def tslice (PSlice. (make-array Object 100) 0)) >> >> and a function: >> >> (defn test-fn [^PSlice slice] >> (print (.gLen slice)) >> ) >> >> Then call (test-fn tslice). >> >> Note that the function will work as intended if no type hints are >> provided, but will run quite slowly due to reflection, defeating the point >> of using mutation. >> > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.