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

Mark Evenson evenson at panix.com
Tue Mar 23 13:55:12 UTC 2010


On 3/23/10 7:21 AM, dmiles at users.sourceforge.net wrote:
[…]
> A commiter should be able to help

Patched as suggested in [r12570][1], although I am not entirely happy 
with this change yet (see below).

[1]: http://trac.common-lisp.net/armedbear/changeset/12570

> On Mon, Mar 22, 2010 at 9:55 PM, David Kirkman<dkirkman at ucsd.edu>  wrote:
>> 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.
[…]

>>
>> Is there a way to specify the intendedClass of array2?

A bit baroque, but one uses JCOERCE.  So, you could get your code to 
work via

	(sys::%make-sys-output-stream
            (jcoerce array2 (jclass-of array1)))

but I think that this is a bit too much of a burden on the end user, so 
I patched the code as Douglas suggested.

I've also updated the INSPECT protocol for JAVA-OBJECT so that users 
(and user code) could have a chance at observing that the two version of 
the array had differences in any tool that uses SYS::GET-INSPECTED-PARTS 
(like the SLIME inspector).

As far as I understand this problem, the insertion/removal of the byte[] 
from the Java collection has erased the type information down to 
java.lang.Object.  This type is "good enough" for the current 
constructors of JAVA-OBJECT (after all java.lang.Object is a valid 
type), but causes problems when being asked to return a Java reference 
in compiled Java code (like that in the 
SYS::%MAKE-BYTE-ARRAY-OUTPUT-STRING.)

My hunch is that need to tighten the JAVA-OBJECT constructors to check 
if they are being asked to wrap an array of primitive type, adjusting 
the value of intendedClass if this is the case.  I'm reluctant to make 
such a change as a) I don't fully understand the ramifications of the 
difference between Class.isInstance() and Class.isAssignableFrom(), b) 
don't know if this only fails for arrays of primitive type, and c) don't 
have enough test coverage to judge such things quickly.

Comments and advice solicited.

-- 
"A screaming comes across the sky.  It has happened before, but there
is nothing to compare to it now."




More information about the armedbear-devel mailing list