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

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

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

泛型的特性:

  泛型只在编译阶段有效,在编译之后程序会采取去泛型化的措施,也就是说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. MySql中 delimiter 详解

    转载于:http://blog.csdn.net/yuxin6866/article/details/52722913 其实就是告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了. ...

  2. Pytorch学习笔记

    非线性回归问题的参数求解,反向求导基本流程.Variable 计算时, 它在后台一步步默默地搭建着一个庞大的系统, 叫做计算图, computational graph. 这个图将所有的计算步骤 (节 ...

  3. 查询Linux系统中glibc的版本

    编写一个简单的程序 #include <stdio.h> int main() { printf("Hello world\n"); ; } 编译 gcc test.c ...

  4. [BJOI2018]双人猜数游戏

    题解: 彻彻底底的思维题???还是挺难的.. 首先连样例解释都没给..没看题解搞了很久 大概就是 一个人要根据另一个人的决策来猜数 可以去看洛谷那篇题解的解释 然后我们用$f[A/B][i][j][k ...

  5. 3998: [TJOI2015]弦论

    题解: 每个点的size值就是这个从根-它出现的次数 如果相同只算一次就全部赋值为1就可以了 代码: #include <bits/stdc++.h> #define ll long lo ...

  6. 3897: Power

    题解: 首先很贪心的选择 有最大的我们一定会用最大的 然后可以将序列分割.. 就变成了一道模拟题了.. 每个状态记录(h,t,h-have,t-need) 注意一下细节就可以了 代码: #includ ...

  7. python全栈开发day92-day96 Vue总结

    -- ES6常用语法 -- var let const -- 模板字符串 -- 反引号 -- ${} -- 箭头函数 -- 普通函数取决于函数最近的调用者 -- 箭头函数取决当前环境 -- 类 -- ...

  8. 关于SQL Server中的系统表之一 sysobjects

    微软Sql Server数据库是企业开发管理中最常用的数据库系统之一.其功能强大而且使用简单.方便.我们在数据库中创建数据库.表.视图.触发器.存储过程.函数等信息. 最常用的功能之一,查询数据,例如 ...

  9. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  10. request和session的区别

    request多用于表单提交,表单数据等 session用于服务器端的记录变量,比如用户的登陆和登出啊 request 资源占用小,安全性较高,但是不持续性 session 资源消耗较大,安全性较低, ...