Hello Jonathan, As Stuart said, the problem is probably appearing the second (and more) times you evaluate the namespace in the repl, whatever the method.
To mitigate the issue, you can also try to avoid redefining the whole namespace containing the type definitions, and just use Ctrl+enter to send fine grained too level definitions to the repl. Le mercredi 22 janvier 2014, Jonathan Barnard <jonathan.t.barn...@gmail.com> a écrit : > 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<javascript:_e({}, 'cvml', > '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 <javascript:_e({}, 'cvml', > 'clojure%2bunsubscr...@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 <javascript:_e({}, 'cvml', > 'clojure%2bunsubscr...@googlegroups.com');>. > For more options, visit https://groups.google.com/groups/opt_out. > -- -- 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.