以下说法错误的是()
List<String> list = new ArrayList<String>();//这里后面加不加String都是一样的,编译时会自动擦除:
Class clazz = list.getClass();
Type genType = clazz.getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (!(params[0] instanceof Class)) {
System.out.println("无法获得类型");
}else{
System.out.println(((Class)params[0]).getName());
}
输出结果:无法获得类型 List<String> list = new ArrayList<String>(){ //这里必须指明String类型,创建一个匿名类实现泛型接口
};
Class clazz = list.getClass();
...同上 输出结果:java.lang.String public static void main(String[] args) throws IllegalAccessException, InstantiationException {
List<String> a = new ArrayList<>();
Class<? extends List> aClass = a.getClass();
ParameterizedType genericSuperclass = (ParameterizedType)aClass.getGenericSuperclass();
Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
for (int i = 0;i <actualTypeArguments.length;i++)
System.out.println(actualTypeArguments[i]);
} /* 通过反射在运行时动态获取List<t>中T的实际类型 */
public class GetGeneric {
public List<String> list;
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Type t = GetGeneric.class.getDeclaredField("list").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1);
}
}
}
}