java基础篇5之泛型

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){

    }

 

posted @ 2017-03-26 22:07  一心行走  阅读(171)  评论(0)    收藏  举报