本帖最后由 风乐 于 2013-7-13 22:49 编辑
擦除是在编译阶段将泛型类型以其父类代替,如String 变成了Object等,也就是说class文件中应该不包含String这个泛型信息了,那么为什么使用反射又可以得到这个泛型信息呢,代码如下- <font color="#333333">package demo;
- import java.lang.reflect.Method;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.Collection;
- import java.util.Iterator;
- public class Try {
- public static void main(String[] args) throws Exception {
- Method method = Class.forName("demo.Ha").getMethod(
- "show1", Collection.class);
- Type[] types = method.getGenericParameterTypes();
- for (Type type : types) {
- System.out.println(type);
- // ParameterizedType 表示参数化类型,如Collection<String>
- ParameterizedType pType = (ParameterizedType) type;
- // interface java.util.Collection
- System.out.println(pType.getRawType());
- // class java.lang.String </font><font color="#ff0000">这里为什么会拿到这个结果</font><font color="#333333">
- System.out.println(pType.getActualTypeArguments()[0]);
- }
- }
- }
- class Ha {
- public static void show1(Collection<String> coll) {
- for (Iterator<String> iterator = coll.iterator(); iterator.hasNext();) {
- String str = iterator.next();
- System.out.println(str);
- }
- }
- }</font>
复制代码
|