什么是泛型?为什么使用泛型?

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

  泛型的本质是为了参数化类型(再不创建新的类型的情况下,通过泛型指定的不同的类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数可以用在类、接口和方法中,分别称之为泛型类、泛型接口和泛型方法。

泛型的特性:

  泛型只在编译阶段有效,在编译之后程序会采取去泛型化的措施,也就是说Java中的泛型只在编译阶段有效,在编译过程中,正确检验泛型结果后会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检验和类型转换的方法,也就是说类型信息不会进入到运行阶段。

泛型的使用:

泛型的使用有三种方式:泛型类、泛型接口、泛型方法

一、泛型类:

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放的是相同的接口。

具体的应用实例:

特别说明:定义的泛型类,并不一定要传入泛型类型实参。在使用泛型的时候如果传入的是泛型实参,则会根据传入的泛型实参作相应的限制,此时泛型才会起到本应起到的限制作用;如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或者成员变量定义的类型可以是任何类型;泛型的类型参数只能是类类型,不能是简单类型。不能对确切的泛型类型使用instanceOf操作,否则编译器会报错。

二、泛型接口:

泛型接口与泛型类的定义以及使用基本是相同的,泛型接口常被用在各种类的生产器中。

1、泛型接口的基本用法(定义一个泛型接口):

2、当实现泛型接口的类,未传入泛型实参时:

当实现泛型接口的类没有传入泛型实参的情况时,与泛型类的定义相同,在声明类时需要将泛型的声明也一起加到类中。即:class FruitGenerator<T> implements Generator<T>{};

3、当实现泛型接口的类传入泛型实参的时候:

相当于定义了一个生产器实现这个接口,虽然我们只创建了一个泛型接口,但是因为泛型接口中参数类型是不确定的,所以可以形成无数种类型的Generator接口。在实现泛型接口的实现类中,如果传入了泛型实参,那么在这个类中所有使用该泛型类型的地方都要替换成成传入的实参类型。

注意:同一种泛型可以对应多个版本(因为参数类型是不确定的),但是不同的泛型参数的泛型实例之间是不兼容的。

4、泛型方法

泛型类实在实例化类的时候指明泛型的具体类型;泛型方法实在调用方法的时候指明泛型的具体类型。

说明:

  • public和返回值 之间的<T>非常重要,可以理解为声明此方法为泛型方法。
  • 只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
  • <T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
  • 与泛型类的定义一样,T只是一个标识符,可以随便写。

4.1、泛型方法的基本用法

泛型方法中一个比较特殊的情况就是泛型方法出现在泛型类中

注意:class GenerateTest<T>这是一个泛型类,那么在里边包含的三个方法其中show_1只是一个普通的方法,只是这个方法存在于泛型类里边,
但它所包含的参数T是和泛型类中的T一致的;show_3,show_2这两个方法是泛型类里的泛型方法,他们所含的泛型方法是一个全新的类型,可以和泛型类中声明的T一样,也可以 不一样。

泛型方法的总结:泛型方法能使方法独立于类而产生变化,一个基本的原则就是:无论何时,就应该尽量使用泛型方法 。

5、泛型边界

Ø  为泛型添加上边界,即是传入的类型实参必须是指定类型的子类型
Ø  在泛型方法中添加上下边界限制的时候,必须在权限说明与返回值之间的<T>之间添加上下边界,即是在泛型声明的时候添加。泛型的上下边界添加,必须与泛型的声明在一起

6、关于泛型数组

     不能创建一个确切的泛型类型的数组,而使用通配符创建泛型数组是可以的。

Java基础知识--泛型的更多相关文章

  1. Java基础知识➣泛型整理(四)

    概述 泛型的本质是参数化类型,使用同一套代码来满足不同数据类型的业务需要,提高代码的执行效率,使代码简单明了. 泛型方法 该方法在调用时可以接收不同类型的参数.根据传递给泛型方法的参数类型,编译器适当 ...

  2. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  3. 【考试】java基础知识测试,看你能得多少分?

    1 前言 共有5道java基础知识的单项选择题,每道20分,共计100分.解析和答案在最后. 2 试题 2.1 如下程序运行结果是什么? class Parent { public Parent(St ...

  4. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  5. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. Java 基础知识总结1

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  8. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  9. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

随机推荐

  1. VS2017+mysql5.7 连接数据库生成实体

    参考:https://www.cnblogs.com/RushPasser/p/5438334.html 下载:https://share.weiyun.com/5rM4FrG mysql-for-v ...

  2. Senparc.Weixin微信开发(3) 自定义菜单与获取用户组

    自定义菜单 代码参考:http://www.cnblogs.com/szw/p/3750517.html 还可以使用他们官网的自定义:https://neuchar.senparc.com/User/ ...

  3. Java集合中List,Set以及Map等集合体系详解(史上最全)

    https://blog.csdn.net/zhangqunshuai/article/details/80660974

  4. javascript 相关小的知识点集合

    本文主要是列出一些javascript 相关的,不限于javascript的,容易记错或者遗忘的小知识,小技巧. 1.javascript中的false 在 JavaScript,常见的 false ...

  5. javascript数组(五)

    一.创建数组.数组操作 数组是指的有序集合.每个值叫做元素,每个元素,每个元素在数组中都有梳子位置编号,也就是索引.JS中数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或其它数组 ...

  6. update + join 多表操作

    UPDATE vtiger_notificationcf as a INNER JOIN vtiger_crmentity as b ON a.notificationid = b.crmid SET ...

  7. Nginx动静分离

    动静分离 Nginx动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路. ...

  8. Python_部分内置函数

    内置函数:可以直接调用的函数 all():传入的列表,元组,等等,只要一个为假,就为假(fales)(所有的都为真才为真) # None, {}:空字典, []:空列表, 0:零,():空集合,“”: ...

  9. linux重启服务的脚本命令

    最近做网站测试,每次测试完成都要重启服务,为此写了一个简单的shell脚本 linux服务重启shell脚本示例 2014年12月18日 linux服务重启脚本,如何实现linux服务的定时重启,可以 ...

  10. 反射-Emit

    一.Emit Emit,可以称为发出或者产出.在Framework中,与Emit相关的类基本都存在与System.Reflection,Emit命名空间下.可见Emit是作为反射的一个元素存在,反射可 ...