@SuppressWarnings("unchecked")
public static <T> Class[] resolveParameterizedClass(
Class<T> genericClass, Class<? extends T> descendantClass)
throws IllegalArgumentException, IllegalStateException {
if (genericClass == null) {
throw new IllegalArgumentException(
"Argument 'genericsClass' ("
+ Class.class.getName() + ") is null");
}
if (descendantClass == null) {
throw new IllegalArgumentException(
"Argument 'descendantClass'("
+ Class.class.getName() + ") is null");
}
List<ParameterizedType> ancestorTypeList =
getAncestorTypeList(genericClass, descendantClass);
ParameterizedType parameterizedType =
ancestorTypeList.get(ancestorTypeList.size() - 1);
Type[] actualTypes = parameterizedType.getActualTypeArguments();
Class[] actualClasses = new Class[actualTypes.length];
for (int i = 0; i < actualTypes.length; i++) {
actualClasses[i] =
resolveTypeVariable(actualTypes[i], ancestorTypeList);
}
return actualClasses;
}