package com.googlecode.totallylazy.proxy; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.Unchecked; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import static com.googlecode.totallylazy.Sequences.sequence; public class Generics { public static <T> Class<T> getGenericSuperclassType(Class<?> aClass, int index) { ParameterizedType type = (ParameterizedType) aClass.getGenericSuperclass(); Type[] actualTypeArguments = type.getActualTypeArguments(); return Unchecked.cast(actualTypeArguments[index]); } public static <T> Class<T> getGenericType(Class<?> aClass, int index) { ParameterizedType type = parameterizedType(aClass); Type[] actualTypeArguments = type.getActualTypeArguments(); return Unchecked.cast(actualTypeArguments[index]); } public static ParameterizedType parameterizedType(Class<?> aClass) { Sequence<Type> interfaces = sequence(aClass.getGenericInterfaces()); if(!aClass.isEnum()) interfaces = interfaces.cons(aClass.getGenericSuperclass()); return interfaces.safeCast(ParameterizedType.class).head(); } }