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;
Adrian wrote:
On Mon, 2007-07-30 at 14:39 +0200, Alexey Loubyansky wrote:
> Adrian wrote:
>> Perhaps we can add that to the ClassInfo model?
> That would be excellent.
>
>> if (classInfo.isCollection())
>> typeInfo = classInfo.getComponentType();
>>
>> and it would do all the hard work of locating the collection
>> definition and retrieving the type.
>>
>> We could also do something similar for maps, i.e.
>>
>> if (classInfo.isMap())
>> {
>> keyType = classInfo.getKeyType();
>> valueType = classInfo.getValueType();
>> }
> This one too!
>
I've implemented this. It was actually easier
than I thought once I got my head around it. :-)
See the bottom of IntrospectionTypeInfoFactoryImpl
The basic idea is to locate the Collection interface
in the type hierarchy
then work your way back mapping TypeVariables
until you reach where the real type is specified.
Or failing that use the upper bounds of the
last TypeVariable found.
> Thanks,
> Alexey
> _______________________________________________
> jboss-development mailing list
> jboss-development(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/jboss-development