一般可以使用反射来获取泛型参数的实际类型,以下是详细代码:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
public class GenericTest {
/*使用反射来获取泛型信息*/
private Map
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
//Class clazz = GenericTest.class;
Class
//System.out.println(clazz);
Field f = clazz.getDeclaredField("score");
//直接使用getType只对普通类型有效,无法取到泛型参数
Class> a = f.getType();
System.out.println("score的类型是:"+a);
//获得Field实例f的泛型类型
Type gType = f.getGenericType();
//如果gType类型是ParameterizedType的对象
if (gType instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) gType;
//获取原始类型
Type rType = pType.getRawType();
System.out.println("原始类型是:"+rType);
//取得泛型类型参数
Type[] tArgs = pType.getActualTypeArguments();
System.out.println("泛型类型是:");
for (int i = 0; i < tArgs.length; i++) {
System.out.println("第"+i+"个泛型类型是:"+tArgs[i]);
}
}else{
System.out.println("获取泛型类型出错!");
}
}
}
输出结果如下:
score的类型是:interface java.util.Map
原始类型是:interface java.util.Map
泛型类型是:
第0个泛型类型是:class java.lang.String
第1个泛型类型是:class java.lang.Integer
List
System.out.println(list.getClass() == ArrayList.class);
输出结果为 true
你这个问题问的很好,说明你很关注泛型。
具体来讲,泛型只是一种编译时机制,只对变量起作用。
List
List mylist = list;
mylist.add(new ArrayList
上面的代码可以编译,也可以运行。
在编译后的 class 文件中是没有泛型信息的。其类型匹配及强转都由编译器进行。如果类型不匹配,则不能编译。
这主要是为了代码运行的高效性,java 编译器分担的运行前检查越多,JVM 的负担就越小。
如果你想进行深入研究,那就要对 class 文件有所了解。
泛型的类型是无法在运行时通过反射取得的,泛型类型在编译成字节码的时候已经被虚拟机给去掉了,只是起到提示编译器进行类型检查的作用
你这个问题很没有意义,并且还是个悖论.list长度为0,里面啥也没有,你还非要去获取它,那根本就是获取不到,况且既然为0,也就更没有必要去获取它.
想深入也不是这么个深入法,这纯粹属于没事找事型的.