/** * Get all type arguments from a generic type, for example {@code [Foo,Bar]} from {@code Map<Foo,Bar>}. * * @param typeLiteral The generic type * @return Array of type arguments */ public static TypeLiteral<?>[] get( final TypeLiteral<?> typeLiteral ) { final Type type = typeLiteral.getType(); if ( type instanceof ParameterizedType ) { final Type[] argumentTypes = ( (ParameterizedType) type ).getActualTypeArguments(); final TypeLiteral<?>[] argumentLiterals = new TypeLiteral[argumentTypes.length]; for ( int i = 0; i < argumentTypes.length; i++ ) { argumentLiterals[i] = expand( argumentTypes[i] ); } return argumentLiterals; } if ( type instanceof GenericArrayType ) { return new TypeLiteral[] { expand( ( (GenericArrayType) type ).getGenericComponentType() ) }; } return NO_TYPE_LITERALS; }
/** * Get an indexed type argument from a generic type, for example {@code Bar} from {@code Map<Foo,Bar>}. * * @param typeLiteral The generic type * @param index The argument index * @return Indexed type argument; {@code TypeLiteral<Object>} if the given type is a raw class */ public static TypeLiteral<?> get( final TypeLiteral<?> typeLiteral, final int index ) { final Type type = typeLiteral.getType(); if ( type instanceof ParameterizedType ) { return expand( ( (ParameterizedType) type ).getActualTypeArguments()[index] ); } if ( type instanceof GenericArrayType ) { if ( 0 == index ) { return expand( ( (GenericArrayType) type ).getGenericComponentType() ); } throw new ArrayIndexOutOfBoundsException( index ); } return OBJECT_TYPE_LITERAL; }