zoukankan      html  css  js  c++  java
  • 泛型代码详解

    package cn.itcast.day2;


    import java.lang.reflect.Method;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.sql.Date;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    import java.util.Vector;


    public class GenericTest {


    /**
    * @param args
    */
    public static void main(String[] args)throws Exception {
    // TODO Auto-generated method stub
    ArrayList<String> collection2=new ArrayList<String> ();
    collection2.add("abc");

    ArrayList<Integer> collection3=new ArrayList<Integer> ();
    //对于泛型,代码编译完就没有我们定义的泛型啦,也就是说ArrayList<Integer> collection3=new ArrayList<Integer> ();
    //编译完为ArrayList collection3=new ArrayList();
    //所以collection2与collection3为同一份字节码
    //所以泛型是给编译器看的,运行时已经没有泛型痕迹
    System.out.println(collection2.getClass()==collection3.getClass());


    //利用泛型跳过编译器向泛型对象中传入其它类型参数
    collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc");
    System.out.println(collection3.get(0));
    /*
    参数化类型与原始类型的兼容性:
    参数化类型可以引用一个原始类型的对象,编译报告警告,例如,Collection<String> c = new Vector();//可不可以,不就是编译器一句话的事吗?
    原始类型可以引用一个参数化类型的对象,编译报告警告,例如,Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去
    */
    printCollection(collection3);

    HashMap<String,Integer> maps=new HashMap<String,Integer>();
    maps.put("zhangsan", 34);
    maps.put("lisi", 35);
    maps.put("wangwu", 36);
    //获得key,value集合
    Set<Map.Entry<String,Integer>> entrySet=maps.entrySet();
    //打印出集合中元素
    for(Map.Entry<String,Integer> entry:entrySet){
    System.out.println(entry.getKey() + ":::" + entry.getValue());
    }
    //只有引用类型才能作为泛型方法的实际参数,swap(new int[3],3,5);语句会报告编译错误
    swap(new String[]{"abc","xyz","itcast"},1,2);
    //swap(new int[]{1,2,3,4,5},2,3);
    Object obj="abc";
    String x3=autoConvert(obj);
    System.out.println(x3);

    //通过反射获得泛型的参数化类型
    Method applyMethod=GenericTest.class.getMethod("applyVector", Vector.class);
    //获得参数的泛型类型,可能有多个所以返回一个数组
    //Type 是 Java 编程语言中所有类型的公共高级接口。
    //它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
    Type[] types=applyMethod.getGenericParameterTypes();
    //ParameterizedType为Type子接口,ParameterizedType 表示参数化类型
    //此处已知有一个参数化类型,所以直接将第一个赋值给pType
    ParameterizedType pType=(ParameterizedType)types[0];

    //打印出泛型参数
    System.out.println(pType.getActualTypeArguments()[0]);

    }

    public static void applyVector(Vector<Date> v1){

    }
    //泛型方法练习--------------------------------

    //编写一个泛型方法,自动将Object类型的对象转换成其他类型。
    public static <T> T autoConvert(Object obj){
    return (T)obj;
    }
    //定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象
    public static <T> void fillArray(T[] a,T obj){
    for(int i=0;i<a.length;i++){
    a[i]=obj;
    }


    }
    //泛型方法练习--------------------------------


    //只有引用类型才能作为泛型方法的实际参数
    public static <T> void swap(T[]a,int i,int j){
    T temp=a[i];
    a[i]=a[j];
    a[j]=temp;
    }


    //该方法用于打印出任意参数化类型的集合中的所有数据
    public static void printCollection(Collection<?> collection){
    System.out.println(collection.size());
    for(Object obj:collection){
    System.out.println(obj);
    }
    }

    }



    package cn.itcast.day2;


    public class GenericDao<T> {
    public  void add(T p){

    }
    public T findById(int Id){
    return null;
    }

    /*public static void update(T obj){
    //静态不能用类上定义的泛型
    }*/
    //静态可以使用自己定义的泛型
    public static <E> void update(E obj){
    }
    }

    分享一下我的学习资料!!!!
    Java全套顶级视频
    http://pro.net.itcast.cn/View-22-1435.aspx
    DotNet全套视频
    http://pro.net.itcast.cn/View-23-1435.aspx
    PHP全套视频
    http://pro.net.itcast.cn/View-24-1435.aspx
    全世界最适合0基础学习编程的网上校园
    http://pro.net.itcast.cn/View-25-1435.aspx
    免费申请java全套视频光盘区域
    http://pro.net.itcast.cn/View-26-1435.aspx




















  • 相关阅读:
    Semaphore
    财报分析
    关于C#中的new的用法
    Linux(CentOS)下Postgresql数据库的安装配置
    CentOS下实现SCP免输密码传送文件
    HiveQL逻辑执行顺序
    CentOS上以源码的方式安装Redis笔记
    Python学习心得(七) 深入理解threading多线程模块
    SQL Server返回两个Date日期相差共多少天零多少小时零多少分钟零多少秒
    Python学习心得(六) 反射机制、装饰器
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3045563.html
Copyright © 2011-2022 走看看