本帖最后由 yufeng47 于 2013-4-19 08:41 编辑
- package cn.itcast.day2;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.lang.reflect.TypeVariable;
- import java.util.ArrayList;
- import java.util.Collection;
- public class GenericQuestion {
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
-
- ArrayList<String> collection1 = new ArrayList<String>();
- Collection<? extends Number> collection2 = new ArrayList<Byte>();
-
- getCollectionTypeOfParameter(collection1);
- getCollectionTypeOfParameter(collection2);
- }
-
- /* 用反射方式获取参数列表中类型变量*/
- public static void getCollectionTypeOfParameter(Collection<?> src)
- throws Exception{
- TypeVariable<?>[] typeVariable = src.getClass().getTypeParameters();
- // 获取引用的通用声明(GetGenericDeclaration)的类型变量(API中对其声明的类型变量)
- System.out.println(typeVariable[0].getGenericDeclaration());
- // 获取引用的类型
- System.out.println(typeVariable[0].getName());
- // 获取类型变量的上边界,上边界一般为Object(除非<? extends Number>,则为Number)
- Type[] type = typeVariable[0].getBounds();
- System.out.println(type[0]);
-
- // 获取方法的原始参数类及其类型变量
- Type[] types = GenericQuestion.class.getMethod
- ("getCollectionTypeOfParameter", Collection.class).getGenericParameterTypes();
- ParameterizedType typeOfParameter = (ParameterizedType)types[0];
- System.out.println(typeOfParameter.getRawType()); //原始参数类型
- System.out.println(typeOfParameter.getActualTypeArguments()[0]);//类型参数
- }
- }
复制代码 /*
由于java中泛型是用于编译器行类型检查和类型推断的,在正式运行生成原始类的字节码时会用擦除技术抹去,
所以貌似不可能实现获取引用的实例化类型参数。不过还是要问哈童鞋们,这种方式能实现么?即上述方法中
如果传入的引用类型是ArrayList<String>,能否就得到原始类 ArrayList和类型变量String呢?
*/ |