一、为什么需要泛型

一般的类和方法,只能使用具体的类型:要么是基本的数据类型,要么是自定义的类。如果要编写可以用于多种数据类型的代码,这种刻板的限制对代码的束缚就会很大。

一个List类

定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于下面1中的错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。

java.lang.ClassCaseException

在如上的编码过程中,我们发现主要存在两个问题:

1.当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。

2.因此,处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。而且人为的强转也不利于代码的复用。

所以我们需要一个方法使得我们能够保证在编译阶段代码不出问题,运行阶段代码就一定不会出问题。而这就是泛型的作用。

二.什么是泛型

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型实例

采用泛型写法后,想加入一个Integer类型的对象时会出现编译错误,通过List,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。

有很多的原因促成了泛型的出现,而最引人注意的一个原因就是为了创造容器类,在我的博客有一篇讨论了java容器类。容器就是存放要使用的对象的地方。数组也是如此,但是数组能保存单一的类型,容器类与数组想比,容器类更加灵活。具备更多不同的功能。

在这里我们观察一下List的接口定义:

List接口定义

我们可以看到,在List接口中采用泛型化定义之后,中的E表示类型形参,可以接收具体的类型实参,并且此接口定义中,凡是出现E的地方均表示相同的接受自外部的类型实参。

自然的,ArrayList作为List接口的实现类,其定义形式是:

ArrayList实现

由此我们可以从源代码的角度明白为什么上面的示例代码会产生编译错误。

三、自定义泛型接口、泛型类和泛型方法

虽然java为我们提供了众多的容器类,但是我们还是会在变成的过程中需要只用自定义的泛型类或者使用泛型参数。

接口、类和方法都可以使用泛型去定义,以及相应的使用。在具体使用时,可以定义泛型接口、泛型类和泛型方法。自定义泛型接口、泛型类和泛型方法与上述Java源码中的List、ArrayList类似。

一个泛型类

这个类根据传进去的参数不同而生成不同的Box对象,但是无论传进去的是什么类型,Box都可以提供getDate的方法,这个方法不依赖具体的类型而实现。从而使得这个代码可以轻松的应用于不同的地方。

在泛型接口、泛型类和泛型方法的定义中,我们经常使用T,E,K,V等大写字母来代表泛型形参,来接受来自己外部对使用时传入的参数。

将上面的代码换成下图:

接口实例运行结果

在使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型(本实例中为Box),当然,在逻辑上我们可以理解成多个不同的泛型类型。

究其原因,在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。

对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型

java 泛型编程_java 泛型编程简介相关推荐

  1. dsl java 语言_Java DSL简介(收集整理)

    一.领域特定语言(DSL) 领域特定语言(DSL)通常被定义为一种特别针对某类特殊问题的计算机语言,它不打算解决其领域外的问题.对于DSL的正式研究已经持续很多年,直 到最近,在程序员试图采用最易读并 ...

  2. webservice java客户端_Java Webservice客户端(最佳方法)

    进行此JAVA的最佳方法是什么? 我个人不会使用Axis 2,即使仅用于客户端开发.这就是为什么我远离它的原因: 我不喜欢它的体系结构,讨厌它的适得其反的部署模型. 我发现这是低质量的项目. 我不喜欢 ...

  3. Java开源项目EZMorph简介

    http://hi.baidu.com/glfbin/blog/item/1302747e8722852e0cd7daaf.html Java开源项目EZMorph简介 2011-04-30 9:40 ...

  4. java.util.Stack类简介

    转载自  java.util.Stack类简介 Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起St ...

  5. java客户端_Java常用的Http client客户端

    Http Client应用场景: Http协议是最重要的网络协议之一,目前移动端的开发.javaweb前后端分离架构,使越来越多的java应用使用http协议访问资源.Http client 大多数场 ...

  6. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  7. java apache commons_Apache commons(Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  8. java引_JAVA中的引用

    JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...

  9. 初学Java多线程:线程简介

     Java多线程初学者指南系列教程http://developer.51cto.com/art/200911/162925.htm 初学Java多线程:线程简介 2009-06-29 17:49 ...

  10. Java关键字之break简介说明

    转自: Java关键字之break简介说明 下文是笔者总结的break关键字的功能简介说明,如下所示 break关键字的功能 break关键字的功能:用于中断for循环中断while循环中断switc ...

最新文章

  1. c语言组队,组队列问题。会做的高手帮帮忙啊
  2. 六月第一枪:股市震荡,下一步该做什么?
  3. 分子克隆基础:什么是质粒
  4. 记一次clickhouse查询问题Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = ‘deny‘)
  5. Android解决依赖冲突
  6. REMarkerClusterer
  7. Install VMware tools 解决(物理主机WIN7X64和VM下的REHAT LINUX AS4共享文件)
  8. java中函数_java中的函数
  9. Linux——CentOS建立一个最高权限的用户
  10. 在线JSON格式化工具
  11. 东芝如何看待蓝牙在物联网热潮下的机遇
  12. JXSE 2.5 : What's Cool #5 -- java.util.concurrent
  13. 2011戴尔计算机配置,机型与配置(一)
  14. Git报错:Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch
  15. 历年真题软件设计师下午考试题汇分析与技巧
  16. Java使用iTextPDF生成PDF文件
  17. html 视频类插件,科技常识:HTML5视频播放插件 video.js介绍
  18. php和mysql web开发 目录_PHP和MySQL Web开发(原书第5版)简介,目录书摘
  19. python安装random_如何安装python randon
  20. win10重装系统打开分区或者磁盘提示无法访问解决办法

热门文章

  1. java mysql 流水号_java实现数据库序号(流水号)
  2. 高等代数_证明_矩阵乘以自身的转置的特征值不小于0
  3. Web测试与App测试的区别
  4. android mac地址 服务器,如何更改或增添android手机的mac地址?
  5. NIFI 自定义 processor 实现
  6. 【MMD动作+镜头】Bo Peep Bo Peep
  7. Matlab中Simulink小白入门初学教程
  8. 在Ubuntu Kylin 优麒麟系统中安装 Etcher镜像烧录软件
  9. 在VMware虚拟机中安装RHEL7
  10. 用vue做一个简单的emoji表情组件