Java泛型学习-20170820

来源:互联网 发布:随机抽奖姓名软件 编辑:程序博客网 时间:2024/06/07 02:42

Java泛型学习系列文章:

Java泛型学习-20170816
http://blog.csdn.net/clandellen/article/details/77219824

Java泛型学习-20170817
http://blog.csdn.net/clandellen/article/details/77285616

Java泛型学习-20170818
http://blog.csdn.net/clandellen/article/details/77351555

Java泛型学习-20170819
http://blog.csdn.net/clandellen/article/details/77394687

前面四篇文章已经将Java的泛型基本讲解完了,本篇文章将会来几个实例进行泛型使用的练习,让你熟练应用泛型的开发工作:

1.前篇文章工厂例子正确的泛型编程

正确代码如下:

public class JianCe<T extends ChangPing> {    public boolean isHeGe(T t){        String name = t.getChangPingName();        System.out.println(name);        //通过名字从而读取对应的数据库的检测数据        double[][] datas = getSQLData(name);//datas[0]-->重量的检测数据,datas[1]-->长度的检测数据        System.out.println(datas[0][0]+"kg<"+t.weight+"kg<"+datas[0][1]+"kg");        System.out.println(datas[1][0]+"cm<"+t.length+"cm<"+datas[1][1]+"cm");        if((t.getWeight()>datas[0][0]&&t.getWeight()<datas[0][1])            &&(t.getLength()>datas[1][0]&&t.getLength()<datas[1][1])){            System.out.println("产品合格!");        }else{            System.out.println("产品不合格!");        }        return false;    }    public static double[][] getSQLData(String name){        //这里模拟的数据库读取数据的过程        double[][] datas = new double[2][2];//datas[0]存放重量合格检测的数据,datas[1]存放长度合格检测的数据        if(name.equals("斧头")){            datas[0][0] = 4.5;            datas[0][1] = 5;            datas[1][0] = 46;            datas[1][1] = 48;        }else if(name.equals("剪刀")){            datas[0][0] = 0.15;            datas[0][1] = 0.2;            datas[1][0] = 10;            datas[1][1] = 12;       }else if(name.equals("铁锤")){            datas[0][0] = 5;            datas[0][1] = 8;            datas[1][0] = 50;            datas[1][1] = 52;      }       return datas;    }    public static void main(String[] args){        JianCe<ChangPing> jianCe = new JianCe<ChangPing>();        List<ChangPing> changPingList = new ArrayList<ChangPing>();        changPingList.add(new FuTou(47,4.8));//合格        changPingList.add(new JianDao(11,0.17));//合格        changPingList.add(new TieChui(51,7));//合格        changPingList.add(new FuTou(22,33.2));//不合格        changPingList.add(new TieChui(22,33.2));//不合格        changPingList.add(new JianDao(22,33.2));//不合格        changPingList.add(new JianDao(22,33.2));//不合格        changPingList.add(new FuTou(22,33.2));//不合格        for(ChangPing changPing:changPingList){             System.out.println("*******************");             jianCe.isHeGe(changPing);             System.out.println("*******************\n");        }    }}class FuTou extends ChangPing{    public final  String name = "斧头";    public FuTou(int length,double weight){        this.length = length;        this.weight = weight;    }    @Override    public String getChangPingName() {        return name;    }}//斧头类class JianDao extends ChangPing{    public final  String name = "剪刀";    public JianDao(int length,double weight){        this.length = length;        this.weight = weight;    }    @Override    public String getChangPingName() {        return name;    }}//剪刀类class TieChui extends ChangPing{    public final  String name = "铁锤";    public TieChui(int length,double weight){        this.length = length;        this.weight = weight;    }    @Override    public String getChangPingName() {        return name;    }}//铁锤类abstract class ChangPing{    int length = 0;//长度    double weight = 0;//重量    public int getLength() {         return length;    }    public void setLength(int length) {        this.length = length;    }    public double getWeight() {        return weight;    }    public void setWeight(double weight) {        this.weight = weight;    }    abstract String getChangPingName();}

2.通过反射和泛型来对任意ArrayList进行规格排序,为了降低复杂程度,比较的属性类型为基本数据类型(Java高手)

完成这个题目需要一定的反射知识。

    //arrayList 要排序的集合   //sortShuXing 排序需要的对应的属性的名字  //shuXingType 排序需要的对应的属性的类型public static <T> ArrayList<T>  sortAnyArrayList(ArrayList<T> arrayList,String sortShuXing,String shuXingType){    if(arrayList.size()==0) {        return arrayList;    }    Field byteField1 = null;    try {        byteField1 = arrayList.get(0).getClass().getDeclaredField(sortShuXing);        byteField1.setAccessible(true);//取得访问权限    } catch (NoSuchFieldException | SecurityException e1) {        // TODO Auto-generated catch block        e1.printStackTrace();    }    for(int i=0;i<arrayList.size()-1;i++) {     for(int j=i+1;j<arrayList.size();j++) {      try {             switch (shuXingType) {             case "byte":                                                                                    case "short":               case "int":                 case "long":                                                                         case "char":                 long b1 = 0;                 long b2 = 0;                 b1 = byteField1.getLong(arrayList.get(i));                 b2 = byteField1.getLong(arrayList.get(j));                 if(b1>=b2) {                     T t = arrayList.get(i);                     arrayList.set(i, arrayList.get(j));                     arrayList.set(j, t);                 }                 break;             case "float":             case "double":                double d1 = 0;                double d2 = 0;                d1 = byteField1.getDouble(arrayList.get(i));                d2 = byteField1.getDouble(arrayList.get(j));                 if(d1>=d2) {                     T t = arrayList.get(i);                     arrayList.set(i, arrayList.get(j));                     arrayList.set(j, t);                 }                 break;             case "String":                 //这里定义String的排序规则,可以按照字典排序                 String s1 = "";                 String s2 = "";                 s1 = (String)byteField1.get(arrayList.get(i));                 s2 = (String)byteField1.get(arrayList.get(j));                                       System.out.println(s1+":"+s2);                 //这里对String的排序请按照自己的排序规则来写                 break;             }         } catch (IllegalArgumentException e) {            // TODO Auto-generated catch block            e.printStackTrace();         } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();         }        }     }     return arrayList;}

3.请写一个方法,这个方法可以根据传入的int值获取对应的类型,比如:1–>String,2–>Integer,3–>Boolean,4–>Character,5–>Double

 public static <T> T getTrueClass(int i){    //1-->String,2-->Integer,3-->Boolean,4-->Character,5-->Double    T  t = null;    if( i == 1){        //        t = (T)new String("1");    }else if(i == 2){        t = (T)new Integer(2);    }else if(i == 3){        t = (T)new boolean(true);     }else if(i == 4){        t =(T)new Character('a');    }else if(i == 5){        t = (T)new Double(5.0);    }    return  t;}

4.查询的多功能:有这么一个数组,当你查询这个数组时,存在两种行为,第1种,只需要反馈一个boolean值代表是否存在该查询的数值,第2种,反馈该查询的数值所有的存在的位置,使用泛型如何设计呢?

public class MyClass {    public static <T> T getMessage(int[] ints, int xingWeiMode, int serachInt){        T t = null;        if(xingWeiMode == 1){            t = (T)new Boolean(false);            //行为1            for(int i=0;i<ints.length;i++){                if(serachInt == ints[i]){                    t = (T)new Boolean(true);                    break;                }            }        }else if(xingWeiMode == 2){            t = (T)new ArrayList<Integer>();            ArrayList<Integer> arrayList = (ArrayList<Integer>)t;            //行为2            for(int i=0;i<ints.length;i++){                if(ints[i] == serachInt){                    arrayList.add(i);                }            }        }else{            //错误的行为码            System.out.println("行为码错误,要么是1要么是2,不能为其他");        }        return t;    }    public static void main(String[] args){        int[] ints = {2,4,6,8,10,12,14,16,18,20,2,2,2,4,4,5,6,7};        boolean b = getMessage(ints,1,4);        System.out.println("是否存在元素4:"+b);        ArrayList<Integer> arrayList = getMessage(ints,2,2);        System.out.println("数组中元素4的位置:");        for(int i:arrayList){            System.out.print("  "+(i+1));        }   }}

5.通过传入的Class返回对应的类型,比如:传入String.class,那么返回类型为String,传入Student.class,那么返回类型为Student。可别小看这个例子,很多框架都有用到这个例子。

 //class1是对应的Class  //Class[]对应的是构造器的参数列表 //Objects[]对应着构造器的参数列表传递的值 public static <T>  T getTrueClass(Class class1,Class[] classs,Object[] objs) {     Object obj = null;     Constructor con = null;     try {         if(objs!=null) {                con = class1.getDeclaredConstructor(classs);                con.setAccessible(true);                obj = con.newInstance(objs);         }else {                con = class1.getDeclaredConstructor();                con.setAccessible(true);                obj = con.newInstance();          }     } catch (NoSuchMethodException e) {            // TODO Auto-generated catch block            e.printStackTrace();     } catch (SecurityException e) {            // TODO Auto-generated catch block            e.printStackTrace();     } catch (InstantiationException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (IllegalAccessException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (IllegalArgumentException e) {        // TODO Auto-generated catch block        e.printStackTrace();    } catch (InvocationTargetException e) {        // TODO Auto-generated catch block        e.printStackTrace();    }    return  (T)obj;}public static void main(String[] args) {    System.out.println(getTrueClass(Student.class, null, null).getClass().getName());    Student s = getTrueClass(Student.class, new Class[] {int.class,String.class}, new Object[] {23,"ellen"});    System.out.println("姓名:"+s.name+",年龄:"+s.age);}class Student {    int age;    String name;    public Student(int age,String name) {        this.age = age;        this.name = name;    }    public Student(){}}
原创粉丝点击