[jboss-dev] generic collection item type

Alexey Loubyansky alexey.loubyansky at redhat.com
Fri Aug 3 04:32:10 EDT 2007


In addition, it would avoid traversing interface hierarchies that do not 
extend reference.

Alexey

Alexey Loubyansky wrote:
> The problem is when clazz argument is an interface and we call 
> clazz.getSuperclass() which is null and which is passed as clazz 
> argument to the next call.
> So, either that or we shouldn't call getSuperclass() on an interface.
> 
> You could comment out the check for 
> reference.isAssignableFrom(interfaceClass) and try this class
> 
>    public abstract class CollectionClass<T1 extends Object, T2 extends 
> Object, T3 extends Object>
>       implements Comparable<T1>, Collection<T2>, java.util.Comparator<T3>
>    {
>    }
> 
> Alexey
> 
> Adrian wrote:
>> I've applied your patch, but I don't understand why the NPE happens?
>> Why wouldn't a class implement its interface?
>>
>> Basically I want to write a test for what you were seeing.
>>
>> ClassInfo info = ...;
>> info.getComponentType(); // Should not throw NPE! :-)
>>
>> On Wed, 2007-08-01 at 11:03 +0200, Alexey Loubyansky wrote:
>>> Yes, it does work! Thanks!
>>>
>>> I had to add a check that the interface implements the reference 
>>> before calling locateActualType because in case of Comparable<T> and 
>>> so on I would get NPE later. I checked out the trunk but it didn't 
>>> build. So, here is the diff.
>>>
>>>         Type[] interfaces = clazz.getGenericInterfaces();
>>>         for (Type intf : interfaces)
>>> -      {
>>> -         Type result;
>>> +      {
>>> +         Class interfaceClass;
>>>            if (intf instanceof Class)
>>>            {
>>> -            Class interfaceClass = (Class) intf;
>>> -            result = locateActualType(reference, parameter, 
>>> interfaceClass, intf);
>>> -            if (result instanceof TypeVariable)
>>> -               result = getParameter(clazz, type, (TypeVariable) 
>>> result);
>>> +            interfaceClass = (Class) intf;
>>>            }
>>>            else if (intf instanceof ParameterizedType)
>>>            {
>>>               ParameterizedType interfaceType = (ParameterizedType) 
>>> intf;
>>> -            Class interfaceClass = (Class) interfaceType.getRawType();
>>> +            interfaceClass = (Class) interfaceType.getRawType();
>>> +         }
>>> +         else
>>> +            throw new IllegalStateException("Unexpected type " + 
>>> intf.getClass());
>>> +
>>> +         Type result = null;
>>> +         if (reference.isAssignableFrom(interfaceClass))
>>> +         {
>>>               result = locateActualType(reference, parameter, 
>>> interfaceClass, intf);
>>>               if (result instanceof TypeVariable)
>>>                  result = getParameter(clazz, type, (TypeVariable) 
>>> result);
>>>            }
>>> -         else
>>> -            throw new IllegalStateException("Unexpected type " + 
>>> intf.getClass());
>>> +
>>>            if (result != null)
>>>               return result;
>>
> _______________________________________________
> jboss-development mailing list
> jboss-development at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jboss-development



More information about the jboss-development mailing list