iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java详细分析讲解泛型
  • 822
分享到

Java详细分析讲解泛型

2024-04-02 19:04:59 822人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.泛型概念2.泛型的使用2.1泛型类语法2.2泛型方法语法2.3泛型接口语法2.4泛型在main方法中的使用3.擦除机制4.泛型的上界5.通配符5.1通配符的上界5.2通配符的

1.泛型概念

泛型就是将类型参数化

所谓类型参数化就是将类型定义成参数的形式,然后在使用此类型的时候的时候再传入具体的类型

到这我们可以看出来:泛型在定义的时候是不知道具体类型的,需要在使用的时候传入具体的类型,泛型可以用在类、接口和方法中,这样做的好处是一个泛型可以适用多种情况

2.泛型的使用

2.1泛型类语法

public class 类名<T> {......}

<T>表示这是一个泛型类,T是type的首字母大写,除此之外的名称还有:

E:element

K:key

V:vlaue

N:number

<>中可以有多个类型参数,中间使用逗号隔开

2.2泛型方法语法

public<泛型类型> 返回值 方法名(泛型类型 参数) {......}

2.3泛型接口语法

public interface 接口名<泛型类型> {......}

2.4泛型在main方法中的使用

下面写一个泛型类来引出后面的内容

class Fc<T>{
    private T a;
    public T get (T data) {
        this.a=data;
        return a;
    }
}

前面说过泛型是在使用的时候再传入具体的类型,所以在实例化上面泛型类的时候要指定类型。具体方式如下

类名<具体类型>变量名=new 类名<具体类型>();

注意:

  • 等号右边<>中可以不写具体类型,编译器可以根据上下文推导出此处的类型
  • <>中只能写入类,所以如果是基本数据类型,就需要写入其对应的包装类,包装类除int是Integer,char包装类是Character外,其余均是首字母大写
  • Java中不能创建泛型数组,至于原因要从Java中泛型的机制说起

3.擦除机制

Java实现泛型是依靠这个擦除机制的,这个机制目前来讲过于复杂,只说结果

Java编译器在编译的时候会去掉类型参数,而对于泛型类型来说,如果指定上界会用上界类型进行替换,没有指定上界则会以Object来进行替换

所以在编译的时候泛型类型都被替换成了Object,编译后的class文件是不包含任何泛型信息的,即泛型信息不会进入到运行时阶段

但Java的数组需要进行运行期类型检查,而由于类型擦除,造成数组运行期类型检查不能正常进行,破坏了Java数组运行期类型检查的机制

4.泛型的上界

所谓泛型的上界就是对传入的类型变量进行约束,指定哪些类型可以传入,哪些不行,语法如下:

class 类名<类型参数extends类型边界> {......}

还是以上面的泛型类为例,现在改成如下情况:

class Fc<E extends Number >{
    private E a;
    public E get (E data) {
        this.a=data;
        return a;
    }
}

那么此时Fc就只能传入Number或者其子类

5.通配符

通配符就是“?”在泛型中使用,它是用来解决泛型无法协变的问题,那什么是协变?

假设有两个类A和B,A继承B,那么泛型Fc<A>应该也是Fc<B>的子类,但泛型不支持这样的父子关系

基于上面的情况,所以需要使用通配符

直接写两个类,A继承B

class B {
}
class A extends B {
}

现在把<B>改成<?>

5.1通配符的上界

通配符也可以指定界限,语法和泛型的上界类似

<? extends 类型边界>

假设<? extends Number>,那么可以传入的是Number及其子类

但需要注意的是:通配符的上界只能用来读取数据,不能用来写入数据

因为我们只知道里面可以传入什么类型的数据,但具体是什么类型我们不知道,所以也就无法对数据进行修改,但是读取则可以直接用父类对象来进行接收读取出来的数据

5.2通配符的下界

下界使用的是super

<? super 类型边界>

<? super Integer>表示可以传入Integer或者其父类

通配符下界可以进行写入数据,但不能用来读取数据

原因也很简单,里面可以传的类都是Integer或者它的父类,写进去的数据可以进行转化,但读取数据用哪一个父类对象接收则不好确定了

6.包装类

由于Java中基本数据类型不是继承Object类,所以为了泛型能够支持基本数据类型,每一个基本数据类型都有各自的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

6.1装箱和拆箱

装箱就是把基本数据类型改为对应的包装类类型,拆箱就是和装箱相反的操作

Java中提供了自动装箱和拆箱机制,但还是先来看下手动装箱和拆箱的操作

//手动装箱
int i=10;
Integer j=Integer.valueOf(i);  //第一种操作
Integer j=new Integer(i);      //第二种操作
//手动拆箱
int a=j.intValue();

自动装箱和拆箱的话代码就要少的多

int i=10;
Integer j=i;  //自动装箱
int a=j;      //自动拆箱

关于int的包装类有一个比较有趣的地方,装箱使用了valueOf方法,其源码如下:

可以看到传给方法的参数首先是和IntegerCache进行比较,如果参数的值是在某个范围中,那么返回的是数组里面的元素,否则返回新的对象

那我们来看看这个IntegerCache

也就是说-128<=i<=127的时候返回的是类中的数组的元素,那么就会有一个情况如下:

原因和上面所讲一样

泛型结束,后面数据结构的时间复杂度和空间复杂度这两个概念就不写了,下一篇直接到顺序表

到此这篇关于Java详细分析讲解泛型的文章就介绍到这了,更多相关Java泛型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java详细分析讲解泛型

本文链接: https://www.lsjlt.com/news/148147.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java详细分析讲解泛型
    目录1.泛型概念2.泛型的使用2.1泛型类语法2.2泛型方法语法2.3泛型接口语法2.4泛型在main方法中的使用3.擦除机制4.泛型的上界5.通配符5.1通配符的上界5.2通配符的...
    99+
    2022-11-13
  • Java 泛型超详细入门讲解
    目录1、什么是泛型2、泛型是怎么编译的泛型的编译机制:擦除机制1、什么是泛型 泛型其实就是将类型作为参数传递,泛型允许程序员在编写代码时使用一些以后才指定的类型 ,在实例化该类时将想...
    99+
    2022-11-13
  • Java 泛型详解(超详细的java泛型方法解析)
    目录2. 什么是泛型3. 使用泛型的好处4. 泛型的使用4.1 泛型类4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高级使用6. 总结1. 为什...
    99+
    2022-11-12
  • C++超详细讲解泛型
    目录1.了解泛型编程2.函数模板2.1简单示例2.2多个模板参数2.3模板实例化2.4模板和普通函数同时存在2.5函数模板不支持定义和声明分离3.类模板3.1简单示例3.2成员函数声...
    99+
    2022-11-13
  • 详细全面解析Java泛型
    1.概述 作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种需求的一个模板,方便我们的使用。但有时候,这个类的范围可能比我们想要的范围要大,我们只想限定于满足类的某...
    99+
    2022-11-13
  • Java详细分析讲解HashMap
    目录1.HashMap数据结构2.HashMap特点3.HashMap中put方法流程java集合容器类分为Collection和Map两大类,Collection类的子接口有Set...
    99+
    2022-11-13
  • Java泛型与注解全面分析讲解
    目录1.什么是泛型2.为何使用泛型2.1.如何定义泛型2.2.通配符2.3.受限泛型2.4.泛型接口2.5.泛型方法3.java高级--注解3.1.预定义注解3.2.自定义注解(初级...
    99+
    2022-11-13
  • Java@GlobalLock注解详细分析讲解
    目录GlobalLock的作用全局锁为什么要使用GlobalLock工作原理GlobalLock的作用 对于某条数据进行更新操作,如果全局事务正在进行,当某个本地事务需要更新该数据时...
    99+
    2022-11-21
    Java @GlobalLock Java @GlobalLock注解
  • Java超详细分析泛型与通配符
    目录1.泛型1.1泛型的用法1.1.1泛型的概念1.1.2泛型类1.1.3类型推导1.2裸类型1.3擦除机制1.3.1关于泛型数组1.3.2泛型的编译与擦除1.4泛型的上界1.4.1...
    99+
    2022-11-13
  • Java 泛型考古 泛型擦除 包装类详细解析
    目录一. 什么是泛型二. 为什么要有泛型 ?示例三、泛型考古四、泛型擦除五、包装类六、装箱拆箱一. 什么是泛型 泛型(generic type)其本质是将类型参数化,也就是说所操作的...
    99+
    2022-11-13
  • C++primer超详细讲解泛型算法
    目录初识泛型算法只读算法写容器算法定制操作lambda表达式lambda捕获和返回再探迭代器插入迭代器iostream迭代器反向迭代器初识泛型算法 只读算法 只读取输入范围内的函数,...
    99+
    2022-11-13
  • TypeScript中泛型的使用详细讲解
    目录一、泛型程序设计是一种编程风格或编程范式二、案例:传入的参数类型与返回的类型一样三、形式类型参数四、泛型约束五、泛型函数六、泛型函数类型推断补充:应用场景总结一、泛型程序设计是一...
    99+
    2022-11-13
    typescript泛型使用 ts 泛型
  • Java超详细分析讲解哈希表
    目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的填充因子代码实现哈希函数添加数据删除数据判断哈希表...
    99+
    2022-11-13
  • Java栈与队列超详细分析讲解
    目录一、栈(Stack)1、什么是栈?2、栈的常见方法3、自己实现一个栈(底层用一个数组实现)二、队列(Queue)1、什么是队列?2、队列的常见方法3、队列的实现(单链表实现)4、...
    99+
    2022-11-13
  • java泛型详细介绍
    一. 泛型概念的提出(为什么需要泛型)?(推荐:java视频教程)首先,我们看下下面这段简短的代码:public class GenericTest { public static void main(String[] args)...
    99+
    2019-06-24
    java基础 java
  • Swift泛型Generics浅析讲解
    目录泛型(Generics)汇编分析泛型的实现原理关联类型(Associated Type)类型约束协议类型的注意点泛型解决不透明类型(Opaque Type)泛型(Generics...
    99+
    2022-11-13
  • Java详细讲解分析双指针法的使用
    目录前言1.判断链表是否有环2.查找链表中间的元素3.奇偶排序前奇后偶4.删除排序链表的重复元素5.三数之和6.分割链表7.合并两个有序的数组8.两数之和—输入有序数组9...
    99+
    2022-11-13
  • 详细分析Java内存模型
    目录一、为什么要学习并发编程二、为什么需要并发编程三、从物理机中得到启发四、Java 内存模型五、原子性5.1、什么是原子性5.2、如何保证原子性六、可见性6.1、什么是可见性6.2...
    99+
    2022-11-12
  • Java超详细分析讲解final关键字的用法
    目录基本介绍final细节01final细节02基本介绍 final 可以修饰类、属性、方法和局部变量. 在某些情况下,程序员可能有以下需求,就会使用到final: Base Sub...
    99+
    2022-11-13
  • Java通俗易懂讲解泛型
    目录1.什么是泛型2.引出泛型3.泛型类的语法4.裸类型5.泛型如何编译的5.1 擦除机制5.2.泛型数组为什么不能实例化6.泛型的上界7.通配符7.1.通配符能用来干嘛7.2.通配...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作