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

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

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

泛型的特性:

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

    TypeScript具有类型系统,且是JavaScript的超集.它可以编译成普通的JavaScript代码. TypeScript支持任意浏览器,任意环境,任意系统并且是开源的.Ts主要用于解决那些 ...

  2. Java集合源码学习(一)Collection概览

    1.集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Coll ...

  3. 【BZOJ1417】Pku3156 Interconnect

    题解: 比较简单的一道题 显然我们只需要知道每个联通块的大小就可以了 然后发现x1+xn=30 其中xi<=xi+1的状态只有5000 所以直接记忆化搜索就可以了 emm原来map还可以映射ve ...

  4. [转]PO BO VO DTO POJO DAO概念及其作用(附转换图)

    来源:http://www.blogjava.net/vip01/archive/2013/05/25/92430.html J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候 ...

  5. Python学习(十六)—— 数据库

    一.数据库介绍 数据库(Database,DB)是按照数据结构来组织.存储和管理数据的,并且是建立在计算机存储设备上的仓库. 数据库指的是以一定方式存储在一起.能为多个用户共享.具有尽可能小的冗余度. ...

  6. Codeforces 886E Maximum Element 组合数学 + dp

    我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程   dp[ i ] = sum(dp[ i - j - ...

  7. Codeforces 1071C Triple Flips 构造

    原文链接 https://www.cnblogs.com/zhouzhendong/p/CF1071C.html 题目传送门 - CF1071C 题意 给定一个长度为 n 的 01 数列,限定你在 $ ...

  8. Trident中使用HBase进行状态管理

    1.使用的类 2.使用HBaseMapState 3.使用状态管理 使用的状态管理还要看Spout StateFactory factory1 = HBaseMapState.opaque(opts1 ...

  9. jquery开发插件提供的几种方法

    http://caibaojian.com/jquery-extend-and-jquery-fn-extend.html

  10. Java中位运算符的使用

    先预知识: 数据在计算机中是以二进制的形式进行存储的,而二进制在内存中是以补码的形式进行存储的.在介绍位运算之前,首先来看一下原码.反码和补码的概念.由于正数的原码.反码和补码的形式都是一样的,所以以 ...