zoukankan      html  css  js  c++  java
  • 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){
    
        }
  • 相关阅读:
    hdu 1863 畅通工程
    poj 2524 Ubiquitous Religions
    04 Linux终端命令01
    05 linux中yum源报错
    Filterg过滤器和Listener监听器
    03 Centos的文件目录、远程连接工具及快照操作
    02 安装虚拟机以及设置虚拟机网卡信息
    01VM虚拟机介绍及配置虚拟机网卡信息
    Jstl表达式
    EL表达式
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/6624316.html
Copyright © 2011-2022 走看看