简单的说,意义和作用有:
  类型的参数化,就是可以把类型像方法的参数那样传递。这一点意义非凡。
  泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。

  泛型方法,算法的复用。蛮神奇的。

想要理解为什么引入泛型,就要知道没有泛型的麻烦。
  我们知道现在的程序开发都是面向对象了,所以程序里会有很多各种类型的对象,对象多了肯定需要有某种类型的容器来装。所以就有了一些容器类型,比如数组、ArrayList、HashMap、TreeSet等。
  对于数组,我们知道需要在使用时指定数组装的对象类型,如:

Animal animal[];Dog dog[];

而对于集合类型容器如ArrayList、HashMap、TreeSet等,它们不但是容器,还提供了一些方法对容器内对象的操作方法,如get,set,sort。这个时候就需要知道容器内放的是什么类型的对象,才能return或set。
  正因为程序开发人员可能把任何类型的对象放进集合容器,所以这些容器在设计的时候只能默认设计成装Object类型对象。因为Java里Object是根类。
        所以容器就成了类似这个样子:

public class ListContainer {private Object obj;public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}
}

这样的话,根据多态,容器就能装任何类型的对象了。不过,取出对象时则需求进行强制类型转换,转换成实际的类型。但这样会有很多类型不安全问题,为什么呢?因为编译器没法帮忙做类型检查,导致代码在运行时易于出现ClassCastException异常。因此,类型安全问题只能由程序员自己来把关了,记住各种类型,避免类型转换错误。

ListContainer myContainer = new ListContainer();myContainer.setObj("123");ArrayList objectList = new ArrayList();objectList.add(myContainer);//下面这句编译时无异常,运行时会ClassCastException异常Integer myStr = (Integer) ((ListContainer)objectList.get(0)).getObj();//下面这句okString myStr = (String) ((ListContainer)objectList.get(0)).getObj();

泛型出场:类型的参数化
  利用泛型,重新设计:

public class ListContainer<T> {private T t;public T getObj() {return t;}public void setObj(T t) {this.t = t;}
}

这里<T>的T的类型的参数,具体T指代什么类型,是String还是Animal还是Dog类型此处不管,而在程序员开发时使用到ListContainer时再指定,如:

ListContainer<Dog> myCon=new ListContainer<Dog>();

这种环境下,编译器就知道ListContainer容器是放Dog类型对象的。并进行类型安全检查。

myCon.setObj(new Dog())//okmyCon.setObj(“123”);//编译时提醒类型错误

这样设计的容器在使用时编译器就可以帮忙做很大一部分的类型安全检查工作了,这就避免了很多运行时的ClassCastException异常,程序员也无需记住各种对象的类型和担心类型匹配问题了。同时大部分情况下也不用做类型强制转换工作了。

ListContainer<String> myContainer = new ListContainer<String>();myContainer.setObj("123");myContainer.setObj(new Dog());//编译器就提醒类型异常ArrayList objectList<ListContainer> = new ArrayList<ListContainer>();objectList.add(myContainer);Integer myStr = (objectList.get(0)).getObj(); //编译时提醒类型异常String myStr = (objectList.get(0)).getObj();

当然泛型的<>里也可以放多个参数,如:

public class MultiContainer<T,S> {private T t;private S s;...MultiContainer<String,Dog> multicon=new MultiContainer<String,Dog>();

有界泛型
  看看这个泛型和多态的问题,Dog,Cat是Animal的子类:

public void killAll(ArrayList<Animal> animals){...};//Animal容器...ArrayList<Animal> animals=new ArrayList<Animal>();animals.add(new Dog());animals.add(new Cat());killAll(animals);//这里okArrayList<Dog> dogs=new ArrayList<Dog>();//Dog是Animal的子类dogs.add(new Dog());dogs.add(new Dog());killAll(dogs);//这里编译不通过

在这里看上去似乎多态不行了。
  这里就要用到有界泛型:
  在使用泛型时,我们会有这种需求:需要指定泛型的类型范围。有界类型就是在类型参数部分指定extends或super关键字,这里的extends也含有implements的功能,分别用上限或下限来限制类型范围,从而限制泛型的类型边界。例如:

<T extends Animal>//限定T是Animal的子类<T super Dog >//限定T是Dog的超类

那么上面那个多态问题就变成:

public void killAll(ArrayList<T extends Animal> animals){...};

解决了。

<T extends Object&Comparable&Serializable>

多个限定时我们可以使用&来进行分割,这时关键词只能使用extends。与多重继承类似,这里只有一个类其他都是接口。
  泛型方法
  有时,我们设计的方法可能其参数类型是不限定的。这种场景如果用重载方法的方式来做的话,算法重复,不是最好的方案。此时泛型方法就可以解决此类问题。
  如Calculator的add方法:

public static < N extends Number > double add( N a, N b ){double sum = 0;sum = a.doubleValue() + b.doubleValue();return(sum);
}

转载地址:http://www.admin10000.com/document/13616.html

泛型的意义和作用是啥?相关推荐

  1. python的用途实例-python中pass语句意义与作用(实例分析)

    想必大家都是刚刚才开始接触python这门语言的,今天这篇文章就来带大家来了解一下python这门语言之中常常会用到的一个语句pass语句.想必大家都很好奇python中pass作用是什么,接下来我就 ...

  2. 【OS学习笔记】十七 保护模式五:保护模式下如何进行内存保护 与 别名段的意义与作用

    上一篇文章学习了如何进入保护模式,以及如何在保护模式下进行内存访问.点击链接查看上一篇文章:进入保护模式与在保护模式下访问内存 首先说明本片文章有对应的汇编代码,点击链接查看:点击查看 本篇文章接着学 ...

  3. 试述hadoop生态系统以及每个部分的具体功能_Hadoop在大数据分析中的意义和作用...

    什么是Hadoop? Apache Hadoop是一个开放源代码软件框架,用于开发在分布式计算环境中执行的数据处理应用程序. 使用HADOOP构建的应用程序可在分布在商用计算机群集上的大型数据集上运行 ...

  4. 数据中台对企业意义和作用有哪些

    随着数据浪潮席卷全球,数数据中台应运而生.众所周知,数据中台的主要功能是统一标准和口径后对数据进行存储和处理,使企业能够提供更高效的服务.总之,数据中台的目标是节约企业成本,实现精细化运营.那么数据中 ...

  5. 数据分析的目的和意义(作用)是什么?

    很多人会问数据分析目的是什么?它有什么作用?让我们看看亿信华辰如何看待数据分析的目的和意义.仅仅谈论数据分析的作用实际上并不重要,因此在谈论该作用之前,我们首先要考虑受众,打个比方:对于个人而言,由于 ...

  6. 校园服务器系统的意义,浅谈校园网络建设的意义与作用.doc

    PAGE PAGE 7 浅谈校园网络建设的意义和作用 摘要:本文围绕校园网建设的意义和作用.结合本校校园网建设的基本经验,运用大量具体实例阐述大力建设校园网络的必要性和可行性,供大家借鉴. 关键字:校 ...

  7. 身份证实名认证API接口有什么意义与作用?

    身份证实名认证API接口有什么意义? 中国公民的身份证是一种对外证明自己身份的有效证件,随着国家对实名制要求的落实,工作与生活中许多场景都会需要进行身份验证.比如出门外出乘座火车与飞机时.注册互联网络 ...

  8. 什么是叫委托,委托的意义和作用

     Public Class Class1 '什么是叫委托,委托的意义和作用. '委托概念的产生原因是因为分别出现了代码的设计者和使用者的关系. '因为这种设计者与使用者的关系的原因,就出现了代码的 ...

  9. 学校计算机室作用意义,学校建设和规划心理咨询室的意义及作用

    原标题:学校建设和规划心理咨询室的意义及作用 据有关资料显示:目前我国1.5亿青少年中受情绪和压力困扰的就有3000万人,而这3000万人中大部分是在校学生.另一方面,教师的心理健康也是十分值得社会关 ...

最新文章

  1. HwBinder入门篇-Android10.0 HwBinder通信原理(一)
  2. 心有多宽 路就有多宽-- BreezeMH源码公布
  3. java 回调模式_总结!!!总结!!!java回调以及future模式
  4. 操作系统(三)操作系统的发展和分类
  5. Qt Creator导入3D资产Importing 3D Assets
  6. 生命游戏c语言代码,c++生命游戏源码
  7. 分布式系统关注点(6)——「负载均衡」到底该如何实施?
  8. 「干货」那些必知的物联网行业术语
  9. python线程如何终止线程_python怎样终止线程
  10. 计算机组成原理试题(三)(附参考答案)
  11. Python Numpy dtype=complex 及查看数据类型
  12. About Redistribute
  13. 移动应用数据统计平台(之一)
  14. RedHat安装yum和配置yum源
  15. 精准营销的神器:小蜜蜂获客系统助你成功
  16. 剪切板的使用: 复制 粘贴
  17. 图像的直方图计算及绘制(红绿蓝三通道直方图)
  18. 兔子c语言程序,可爱的C语言程序。....兔子问题...斐波那契数列
  19. Semantic Parsing via Staged Query Graph Generation: Question Answering with Knowledge Base(笔记)
  20. 基带0day漏洞可攻击数百万部华为手机

热门文章

  1. 助力高校科研信息化升级,让高校更“高效”
  2. H264解析sps提取宽高(好用)
  3. Broekett定理):
  4. 移远EC20设置RNDIS模式拨号上网
  5. KVS+keepalived群集
  6. Best Free Web Applications
  7. ubuntu下查看电脑系统信息
  8. 数据库应用——MySQL数据管理
  9. LinuxProbe学习笔记(二)
  10. linux 第十五天 linuxprobe