[jboss-dev] generic collection item type
Alexey Loubyansky
alexey.loubyansky at redhat.com
Mon Jul 30 10:15:04 EDT 2007
The required information seems to be there.
// field
private CollectionClass<Integer, Long, Double> cc;
public void testMain() throws Exception
{
ClassInfo info = (ClassInfo)
configuration.getTypeInfo(getClass().getDeclaredField("cc").getGenericType());
while(info.isCollection())
{
printInfo(info);
if(info.getGenericInterfaces() != null)
{
ClassInfo colInfo = info;
while (!colInfo.getName().equals(Collection.class.getName()))
{
InterfaceInfo[] gi = colInfo.getGenericInterfaces();
for (InterfaceInfo ii : gi)
{
if (ii.isCollection())
{
printInfo(ii);
colInfo = ii;
break;
}
}
}
}
if (info.getGenericSuperclass().isCollection())
{
info = info.getGenericSuperclass();
}
else
{
break;
}
}
}
private void printInfo(ClassInfo info)
{
System.out.println((info.isInterface() ? "interface" : "class") +
": " + info + ", isCol=" + info.isCollection());
TypeInfo[] typeArgs = info.getActualTypeArguments();
if(typeArgs == null)
{
System.out.println("no args");
}
else
{
System.out.println("type args:");
TypeVariable[] typeVars = info.getType().getTypeParameters();
for(int i = 0; i < typeArgs.length; ++i)
{
System.out.println(" " + typeVars[i].getName() + "=" +
typeArgs[i].getName());
}
}
System.out.println("---");
}
public abstract class CollectionClass<T1 extends Object, T2 extends
Object, T3 extends Object>
implements Comparable<T2>, Collection<T1>, java.util.Comparator<T3>
{
}
The output is
class:
ParameterizedClassInfo at 7b7072{org.jboss.xml.binding.test.MainTestCase.org.jboss.xml.binding.test.MainTestCase$CollectionClass<java.lang.Integer,
java.lang.Long, java.lang.Double>}, isCol=true
type args:
T1=java.lang.Integer
T2=java.lang.Long
T3=java.lang.Double
---
interface: ParameterizedClassInfo at 913750{java.util.Collection<T1>},
isCol=true
type args:
E=java.lang.Object
---
Note, that the interface is printed with the T1 variable. And I can get
the value of T1 from the super class. But I can't find out using the API
that T1 is passed to the Collection.
Alexey
Adrian wrote:
> On Mon, 2007-07-30 at 14:39 +0200, Alexey Loubyansky wrote:
>> That's my problem. How can I find out using the API which parameter is
>> passed to the Collection
>>
>> public abstract class CollectionClass<T1 extends Object, T2 extends
>> Object, T3 extends Object>
>> implements Comparable<T2>, Collection<T1>, java.util.Comparator<T3>
>> {
>> }
>>
>> Besides that I have to keep track of arguments from sub- to super
>> classes. And Collection interface can be extended implemented on
>> different levels with different type parameters (but those should belong
>> to the same type hierarchy).
>> But the main problem I think is the first one above.
>
> That's a very good question. If the class implements
> Collection<Whatever> directly, you can get at this
> information.
>
> It's just:
>
> for (ClassInfo intf : myClass.getInterfaces())
> {
> if (intf.getName().equals(Collection.class.getName())
> return intf.getActualTypeArguments()[0];
> }
>
> But if it is on a superclass, there is no way to get
> at this information.
>
> In the main java reflection api:
>
> Class.getGenericSuperClass() returns a ParameterizedType
>
> but from that ParameterizedType there is no route
> to get the generic interfaces.
>
> e.g.
> public class MyClass extends AbstractCollection<Whatever>
>
> then there's no way to get at the ParameterizedType
> Collection<Whatever> that AbstractCollection<Whataver> implements.
>
> What would really be useful would be if there was a
> Class.getAllGenericInterfaces();
> but that doesn't exist.
>
>
More information about the jboss-development
mailing list