JAVA中不能直接获取范型参数类型,
如下:
List<String> strLists=new ArrayList<String>();
List<Integer> intLists=new ArrayList<Integer>();
实际开发中有可能出现需要根据List中范型参数类型(如strLists和intLists中范型参数类型分别为 String 和Integer)。
简而言之就是获取List<T> 中T的类型,根据不同的类型做相应的处理。
搜索了不少资料,然而并没有什么发现多少清晰的思路,一般就是用反射。
在安卓领域把反射用的出神入化的首先就是我们所熟知的Gson(当然还有eventbus,green dao等),Gson支持范型集合等解析。
庆幸Gson源码中有一个获取范型参数类型方法,实现原理也是用反射
于是抽出一个工具类:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import com.google.gson.internal.$Gson$Types;
public class ClassTypeUtils {
public static Type getSuperTypeParameter(Class<?> subclass) {
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types
.canonicalize(parameterized.getActualTypeArguments()[0]);
}
}
使用方法如下:
List<String> strLists=new ArrayList<String>();
Type type=ClassTypeUtils.getSuperTypeParameter(strLists.getClass());