[armedbear-devel] Losing type information after storing in java.util.ArrayList

David Kirkman dkirkman at ucsd.edu
Tue Mar 23 04:55:51 UTC 2010


I've got a subtle problem:  if I create a byte array, store it in a
java.util.ArrayList, and then retrieve the stored byte array, what I get
back is not quite the same type as the original byte array.  I think that
everything is the same, except that the JavaObjects have different values
for the intendedClass field.

Here is an example:

(setq array1 (jnew-array "byte" 1))

(setq array2
      (let ((array-list (jnew (jconstructor "java.util.ArrayList"))))
        ;; put the byte array into the ArrayList
        (jcall (jmethod "java.util.AbstractList" "add" "java.lang.Object")
               array-list array1)
        ;; and pull it back out
        (jcall (jmethod "java.util.AbstractList" "get" "int")
               array-list 0)))

(describe array1)
;#<jarray [B at c4ff22 {4A44DD}> is an object of type JAVA-OBJECT.
;The wrapped Java object is an array of bytes with 1 element.; No value

(describe array2)
;#<jarray [B at c4ff22 {5E6B62}> is an object of type JAVA-OBJECT.
;The wrapped Java object is an array of bytes with 1 element.; No value

At this point array1 and array2 look pretty compatible, but ...

(sys::%make-byte-array-input-stream array1)
; works fine, gives a #S(SYSTEM::SYSTEM-STREAM)

(sys::%make-byte-array-input-stream array2)
; gives a TYPE-ERROR, with message "java.lang.Object is not assignable to [B"

The TYPE-ERROR comes from JavaObject.javaInstance(Class<?> c) (line 248
of JavaObject.java).  It seems that array1 has intendedClass="[B", and
array2 has intendedClass="java.lang.Object", so I'm pretty sure that's my
problem.

Is there a way to specify the intendedClass of array2?

Thanks,

-david k.




More information about the armedbear-devel mailing list