jetbrick-commons/src/main/java/jetbrick/reflect/TypeResolverUtils.java
public static Class<?> getRawType(Type type, Class<?> implClass) {
        if (type instanceof Class) {
            return (Class<?>) type;
        }
        if (type instanceof ParameterizedType) {
            ParameterizedType pType = (ParameterizedType) type;
            return getRawType(pType.getRawType(), implClass);
        }
        if (type instanceof WildcardType) {
            WildcardType wType = (WildcardType) type;

            Type[] lowerTypes = wType.getLowerBounds();
            if (lowerTypes.length > 0) {
                return getRawType(lowerTypes[0], implClass);
            }

            Type[] upperTypes = wType.getUpperBounds();
            if (upperTypes.length != 0) {
                return getRawType(upperTypes[0], implClass);
            }

            return Object.class;
        }
        if (type instanceof GenericArrayType) {
            Type genericComponentType = ((GenericArrayType) type).getGenericComponentType();
            Class<?> rawType = getRawType(genericComponentType, implClass);

            return Array.newInstance(rawType, 0).getClass();
        }
        if (type instanceof TypeVariable) {
            TypeVariable<?> varType = (TypeVariable<?>) type;
            if (implClass != null) {
                Type resolvedType = resolveVariable(varType, implClass);
                if (resolvedType != null) {
                    return getRawType(resolvedType, null);
                }
            }
            Type[] boundsTypes = varType.getBounds();
            if (boundsTypes.length == 0) {
                return Object.class;
            }
            return getRawType(boundsTypes[0], implClass);
        }
        return null;
    }
public static Class<?> getRawType(Type type, Class<?> implClass) {
        if (type instanceof Class) {
            return (Class<?>) type;
        }
        if (type instanceof ParameterizedType) {
            ParameterizedType pType = (ParameterizedType) type;
            return getRawType(pType.getRawType(), implClass);
        }
        if (type instanceof WildcardType) {
            WildcardType wType = (WildcardType) type;

            Type[] lowerTypes = wType.getLowerBounds();
            if (lowerTypes.length > 0) {
                return getRawType(lowerTypes[0], implClass);
            }

            Type[] upperTypes = wType.getUpperBounds();
            if (upperTypes.length != 0) {
                return getRawType(upperTypes[0], implClass);
            }

            return Object.class;
        }
        if (type instanceof GenericArrayType) {
            Type genericComponentType = ((GenericArrayType) type).getGenericComponentType();
            Class<?> rawType = getRawType(genericComponentType, implClass);

            return Array.newInstance(rawType, 0).getClass();
        }
        if (type instanceof TypeVariable) {
            TypeVariable<?> varType = (TypeVariable<?>) type;
            if (implClass != null) {
                Type resolvedType = resolveVariable(varType, implClass);
                if (resolvedType != null) {
                    return getRawType(resolvedType, null);
                }
            }
            Type[] boundsTypes = varType.getBounds();
            if (boundsTypes.length == 0) {
                return Object.class;
            }
            return getRawType(boundsTypes[0], implClass);
        }
        return null;
    }
public static Class < ? > getRawType ( Type type , Class < ? > implClass ) { if ( type instanceof Class ) { return ( Class < ? > ) type ; } if ( type instanceof ParameterizedType ) { ParameterizedType pType = ( ParameterizedType ) type ; return getRawType ( pType . getRawType ( ) , implClass ) ; } if ( type instanceof WildcardType ) { WildcardType wType = ( WildcardType ) type ; Type [ ] lowerTypes = wType . getLowerBounds ( ) ; if ( lowerTypes . length > 0 ) { return getRawType ( lowerTypes [ 0 ] , implClass ) ; } Type [ ] upperTypes = wType . getUpperBounds ( ) ; if ( upperTypes . length != 0 ) { return getRawType ( upperTypes [ 0 ] , implClass ) ; } return Object . class ; } if ( type instanceof GenericArrayType ) { Type genericComponentType = ( ( GenericArrayType ) type ) . getGenericComponentType ( ) ; Class < ? > rawType = getRawType ( genericComponentType , implClass ) ; return Array . newInstance ( rawType , 0 ) . getClass ( ) ; } if ( type instanceof TypeVariable ) { TypeVariable < ? > varType = ( TypeVariable < ? > ) type ; if ( implClass != null ) { Type resolvedType = resolveVariable ( varType , implClass ) ; if ( resolvedType != null ) { return getRawType ( resolvedType , null ) ; } } Type [ ] boundsTypes = varType . getBounds ( ) ; if ( boundsTypes . length == 0 ) { return Object . class ; } return getRawType ( boundsTypes [ 0 ] , implClass ) ; } return null ; }
Returns raw class for given <code>type</code> when implementation class is known
and it makes difference.

@param type - given type
@param implClass - implementation clas
@return raw class
@see #resolveVariable(java.lang.reflect.TypeVariable, Class)
Returns raw class for given <code > type< / code > when implementation class is known and it makes difference .