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.

Reply via email to