1 泛型的基本应用
//反射方式 指定类型,就不用强转
Construcctor<String> constructor = String.class.getConstructor(Stringbuffer.class);
泛型是提供给javac编译器使用的,可以限定集合输入的类型,
编译器编译带类型说明的集合时,会除掉类型信息,
返回的数据类型不用强转
2 泛型的内部原理和更深应用
ArrayList<Integer> collection1 = new ArrayList<Integer>(); collection1.getClass().getMethod("add",Objec.class).invoke(collection1,"abc"); collection1.get(0);//abc
泛型是给编译器看的
例子:
ArrayList<E> E称为参数类型或类型参数
泛型里面参数不要考虑父子关系
Collecion<Object>!= Collection<Integer>
3 泛型的通配符?
Collection<?>
使用?通配符可以引用其他参数化的类型,?通配符定义的
变量主要用作引用,可以调用与参数化无关的方法,不能调用与
参数化有关的方法。
泛型中的?通配符的扩展
限定通配符的上边界:
Vector<? extends Number> x = new Vector<Integer>();
限定通配符的下边界:
Vector<? super Integer> x = new Vector<NUmber>();
限定通配符总是包括自身
HashMap<String,Integer> maps = new HashMap<String,Integer>(); maps.put("zxx",28); maps.put("lhm",35); maps.put("flx",35); Set<Map.Entry<String,Intger>> entrySet = maps.entrySet(); for(Map.Entry<String,Intger> entry:entrySet){ entry.getKey()+":"+entry.getValue(); }
4 自定义泛型方法及应用
swap(new String[]{"abc","dw","dsf"},1,2) public static <T> void swap(T[] a,int i,int j){ T tmp = a[i]; a[i] =a[j]; a[j] = tmp; } Object obj ="abc"; String x2= autoConvert(obj); private static <T> T autoConvert(Object obj){ return (T)obj; } private static <T> fillArray(T[] a, T obj){ for(int i=0;i<a.length;i++){ a[i] = obj; } }
泛型的应用在返回值之前用<T> 来表示
然后在实际应用中根据实际类型值进行参数应用
类泛型
public class GenericDao<E>{ public <E> void add(E x){ } public E findById(int id){ return null; } public void delete(E obj){ } public void update(E obj){ } public Set<E> findByConditions(String where){ return null; } } GenericDao<ReflectPoint> dao - new GenericDao<ReflectPoint>(); dao.add(new ReflectPoint(3,3));
静态方法不能用类的泛型
5 通过反射获取泛型实际类型参数
编译完成之后去类型化
Method applyMethod = GenericTest.class.getMethod("applyVector",Vector.class); Type[] types = applyMethod.getGenericParameterTypes(); ParameterizeType pType = (ParameterizeType)Types[0]; pType.getRawType(); pType.getActualTypeArguments()[0]; public static void applyVector(Vector<Date> v1){ }