Java泛型学习-20170816

来源:互联网 发布:客机纸模型图纸淘宝 编辑:程序博客网 时间:2024/06/05 10:45

Java泛型可谓是Java中最难啃的一块骨头,但是你掌握了它,应该可以算的上是一个高手吧!所以我们一起来学习一下Java泛型:
http://blog.csdn.net/explorers/article/details/454837#_Toc111865959

1.集合和泛型

谈到泛型,那必须得跟集合联系起来,因为Java集合如此强大,这功劳非泛型莫属。学过集合的你,应该对泛型有些许了解。那么我们又该如何去系统的学习泛型呢?

我截个屏个大家看看:

很多集合都实现了List接口,由上图可以看出这个List接口是一个泛型的接口,为什么把集合设计成这样呢?集合就是存放很多对象的容器,没有泛型之前,也就是JDK1.4及以前,集合的取是件麻烦事,因为你向里面存的对象都会被向上转型为Object对象,取得时候还得进行强制转换,而且极容易出现转换异常,所以由于这些毛病,Java设计人员引入泛型,这是多么伟大的一个创举,自此再也不用担心一个集合放不同的对象,取的时候还要强制转换,集合的厉害与泛型脱不了关系,这知识大家应该都知道,那么泛型肯定不止在集合方面使用吧!所以我们来系统学习一下泛型,成为Java高手吧!

2.如何去设计一个简单的泛型类?

2.1 什么是泛型?

泛型究竟是什么东东?强大而神秘,甚至在设计的时候很难以掌控,泛型嘛,就是广泛的类型的意思,可以理解它是类型的变量,什么是类型的变量呢?就是它的参数是一个类型,将类型参数化了,比如参数可以是:Integer,String,Char,Boolean以及自定义的类等等,注意泛型的参数不能是基本类型,必须是一个类,理解这个对于后面的学习相当重要,所以这里一定要理解,否则后面就难以学习了。

2.2 设计一个简单的泛型类

public class Box<T> {    public void getTString(T t){        System.out.println("Box<"+t.getClass()+">的方法输出:"+t);    }}

很明显这是泛型类,泛型变量名为T,getTString()方法输出泛型变量T的引用t,那我们来使用使用这个泛型类,代码如下:

Box<String> box = new Box<String>();box.getTString("dasdas");

运行结果毫无疑问,输出如下信息:
这里写图片描述
当你使用下面这段代码调用泛型类时,结果不用我说你也知道吧!
Box box = new Box();
box.getTString(5);

2.3 泛型实例

这就是泛型的魅力所在,对于很多类,如果你对它们操作是相同的,而不想去为每一个类去设计一个方法,那么泛型将会满足你的需求,比如,我们来一个实例来理解理解,某个工厂需要检验产品的合格度,这个公司生产斧头,剪刀,铁锤,检查条件如下:

这三个生产的物品分表代表着三个类,那么你如何去检测它们是否合格呢?总不能为每个产品类添加一个单独的检测方法吧!如果这么做,假设该厂的产品不止这三个呢,有上百个那么多,是不是代码一下子就多了起来了,其实检测的数据可以放入数据库当中,每次检测产品的时候先确定其产品类型,然后再去去合适的检测数据,最后检测是否合格,说了多还不如上代码来的直接啊! 代码如下:

public class JianCe<T> {    public boolean isHeGe(T t){        if(t instanceof FuTou){            //说明传入进来的是斧头的实例对象,那么就进行斧头的合格检测            FuTou fuTou = (FuTou)t;            System.out.println("斧头:\n4.5kg<"+fuTou.getWeight()+"<5kg   46cm<"+fuTou.getLength()+"<48cm ");            if((fuTou.getWeight()>4.5&&fuTou.getWeight()<5)                &&(fuTou.getLength()>46&&fuTou.getLength()<48)){                System.out.println("产品合格!");                return true;//检测合格            }else{                System.out.println("产品不合格!");            }        }else if(t instanceof JianDao){            //说明传入进来的是剪刀的实例对象,那么就进行剪刀的合格检测            JianDao jianDao = (JianDao) t;            System.out.println("剪刀:\n0.15kg<"+jianDao.getWeight()+"<0.2kg   10cm<"+jianDao.getLength()+"<12cm ");            if((jianDao.getWeight()>0.15&&jianDao.getWeight()<0.2)                &&(jianDao.getLength()>10&&jianDao.getLength()<12)){                System.out.println("产品合格!");                return true;//检测合格            }else{                System.out.println("产品不合格!");            }        }else{            //说明传入进来的是铁锤的实例对象,那么就进行铁锤的合格检测            TieChui tieChui = (TieChui) t;            System.out.println("铁锤:\n5kg<"+tieChui.getWeight()+"<8kg   50cm<"+tieChui.getLength()+"<52cm ");            if((tieChui.getWeight()>5&&tieChui.getWeight()<8)                &&(tieChui.getLength()>50&&tieChui.getLength()<52)){                System.out.println("产品合格!");                return true;//检测合格            }else{                System.out.println("产品不合格!");            }        }        return false;    }    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();}

这个例子可以进一步优化,在isHeGe()方法中检测合格的数据我们可以直接在数据库或者是文件等存储数据的地方进行读取,这样我们就可以把判断产品类型的代码再次进行精简,由于为了让大家看得懂一些,笔者没有采用这种方式,实际开发过程中必须采用这种方式。

看完我们这个例子,你是不是对泛型有点认识了呢?这还是一道小菜而已,真正的大菜还在后面呢,请继续后面的学习吧!通过后面的学习,我们将会对这个例子再进行精简,所以后面会经常性的拿这个例子讲解,忘同学们一定要搞懂这个例子。其实很简单就能掌握,应该不难。