public static Type[] getGenericParameterForClass(Type type, Class<?> interfaceClass) { if (isAssignable(interfaceClass, type)) { // first look for the interface Type genericInterface = getGenericInterface(type, interfaceClass); final Type[] types; if (genericInterface != null) { if (genericInterface instanceof ParameterizedType) { types = ((ParameterizedType) genericInterface).getActualTypeArguments(); } else { return null; } } else { types = getGenericParameterForClass(TypeHelper.getGenericSuperType(type), interfaceClass); } resolveTypeVariables(type, types); return types; } else { throw new IllegalArgumentException("type " + type + " does not implement/extends " + interfaceClass); } }
public static Type[] getGenericParameterForClass(Type type, Class<?> interfaceClass) { if (isAssignable(interfaceClass, type)) { // first look for the interface Type genericInterface = getGenericInterface(type, interfaceClass); final Type[] types; if (genericInterface != null) { if (genericInterface instanceof ParameterizedType) { types = ((ParameterizedType) genericInterface).getActualTypeArguments(); } else { return null; } } else { types = getGenericParameterForClass(TypeHelper.getGenericSuperType(type), interfaceClass); } resolveTypeVariables(type, types); return types; } else { throw new IllegalArgumentException("type " + type + " does not implement/extends " + interfaceClass); } }
private static Type getGenericInterface(Type t, Class<?> i) { if (TypeHelper.areEquals(t, i)) { return t; } Type[] genericInterfaces = TypeHelper.toClass(t).getGenericInterfaces(); for(Type it : genericInterfaces) { if (isAssignable(i, it)) { if (areEquals(it, i)) { return it; } else { return getGenericInterface(it, i); } } } return null; }
private static Type getGenericInterface(Type t, Class<?> i) { if (TypeHelper.areEquals(t, i)) { return t; } Type[] genericInterfaces = TypeHelper.toClass(t).getGenericInterfaces(); for(Type it : genericInterfaces) { if (isAssignable(i, it)) { if (areEquals(it, i)) { return it; } else { return getGenericInterface(it, i); } } } return null; }