一、泛型是提供给Java编译器使用的,可以限定集合中的输入类型,如定义集合ArrayList
- ArrayList collection = new ArrayList()
- ArrayList<Integer> collection1 = new ArrayList<Integer>
如果在collection1中add("abc"),则编译时会报错,通不过。
但如果collection 与collection1 通过编译,则它们的类型是一样的,都是ArrayList类型
- System.out.println(collection.getClass()== collection1.getClass())
通过反射的方法,可以给ArrayList<Integer>类型增加一个String类型的成员,如
- collection1.getClass().getMethod("add",String.class).invoke(collection1,"abc")
- System.out.println(collection.get(0))
----->打印abc
二、使用泛型的特点
- ArrayList<Integer>称为参数化类型
- ArrayList称为原始类型
- Vector<String> v = new Vector<Object>()
- Vector<Object> v = new Vector<String>()
三、泛型中的?通配符
- public static void printCollection(Collection<?> collection){}
四、泛型中的?通配符的扩展
限定通配符的上边界
- Vector<? extends Number> v = new Vector<Ingeter>();
----->正确,<? extends Numbe>表示?是Number的子类
限定通配符的下边界
- Vector<? supper Integer> v = new Vector<Number>();
----->正确,<? supper Integer>表示?是Integer的父类
五、自定义泛型
- public static <T> void changeT(T x[],int i,int j)
//<T>表示参数类型为T类,传入的参数类型也是T,T代表任意类,不可以是基本数据类型
- public static <K,V> void change(K key,V value){}
六、实例
- public static <T> void copy(Collection<T> des,T[] src){
- for(int i=0;i<src.length;i++){
- des.add(src[i]);
- }}
七、在类定义中应用泛型
- class GenericDao<T>{
- public void save(T obj){}
- public T getById(int id){return null;}
- }
//在对此泛型类进行参数化时,类型参数的实例必须是引用类型,不能是基本类型
- GenericDao<String> gd = new GenericDao<String>();
//创建类实例对象
八、用反射的方法获得泛型的类型
Collection<String>与Collection<Integer>在内存中的字节码是一致的,但如何知道一个实例化对象的泛型是String,而不是Integer呢?
- public void applyVector(Vector<String> str){}
- Method applyMethod = People.class.getMethod("applyVector", Vector.class);
- applyMethod.getGenericParameterTypes()[0]