广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 泛型考古 泛型擦除 包装类详细解析
  • 216
分享到

Java 泛型考古 泛型擦除 包装类详细解析

2024-04-02 19:04:59 216人浏览 八月长安

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

摘要

目录一. 什么是泛型二. 为什么要有泛型 ?示例三、泛型考古四、泛型擦除五、包装类六、装箱拆箱一. 什么是泛型 泛型(generic type)其本质是将类型参数化,也就是说所操作的

一. 什么是泛型

泛型(generic type)其本质是将类型参数化,也就是说所操作的数据类型被指定为一个参数这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

二. 为什么要有泛型 ?

之前写过MyArrayList顺序表,这个类当时自己在实现的时候只能用一种类型来表示,也就是用的时候自己实现的MyArrayList只能应用于一种类型,要想应用于其他类型,就得再写一个其他类型的MyArrayList,这样就比较麻烦,而有了泛型之后就很好的解决了这个问题,让类型参数化,使得自己写的MyArrayList可以适用于多种场景

通过以下代码对比就可发现泛型的方便之处

示例

不带泛型


public class MyArrayList {
    private int[] array;
    private int size;    // 有效数据个数
    public MyArrayList() {
        this.array = new int[10];
        this.size = 0;
    }
    public void add(int x) {    // 暂不考虑扩容
        this.array[size] = x;
        this.size++;
    }
}

带泛型


import org.omg.CORBA.Object;

public class MyArrayList2<E> {
    // 在类的实现中,可以直接将类当成一种数据类型来使用。在实例化该类的时候这个类型才被确定
    private E[] array;
    private int size;   // 有效数据个数
    public MyArrayList2() {
        this.array = (E[])new Object[10];   // 注意:Java中泛型不允许定义数组
        this.size = 0;
    }
    public void add(E e) {    // 不考虑扩容
        this.array[size] = e;
        this.size++;
    }
}
// 带泛型的顺序表元素类型是一个“变量”
// E就是变量的名称

通过上面这两段代码的对比,就可以发现,带泛型的顺序表和不带泛型的顺序表只是表示类型的部分不一样,代码所实现的逻辑是一样的

类的实例化与使用


public static void main(String[] args) {
    MyArrayList myArrayList = new MyArrayList();
    myArrayList.add(1);
    myArrayList.add(2);
																	// 这里其实就相当于是将String类型赋值给E
    MyArrayList2<String> stringMyArrayList2 = new MyArrayList2<String>();    // 等号右边的<>内可以省略
    stringMyArrayList2.add("1");                                           // 要想用基本类型,要写基本类型对应的包装类
    stringMyArrayList2.add("2");
}

对于泛型来说,类型是在使用该类时才明确定义出来的

三、泛型考古

要知道其实刚开始Java体系中是没有泛型的,是在jdk1.5之后才才有了泛型

在JDK1.5之前是利用Object引用可以指向任意类型的对象实现类似泛型的效果

  • Object类是所有类的祖先类
  • 上层引用可以指向下层对象

如下代码:


public class MyArrayList3 {
    private Object[] array;
    private int size;
    public MyArrayList3() {
        this.array = new Object[10];
        this.size = 0;
    }
    public void add(Object e) {
        this.array[size] = e;
        size++;
    }
}

这种做法的缺点也很明显,就是new了一个MyArrayList,里面打算存int类型的数据,但由于手滑,存入了一个String类型的数据,这样的话编译器是不会报错的,程序也能正常运行,直到需要取list中的元素的时候程序才会抛出异常。

泛型就很好的解决了这个问题,只要类型不匹配,错误会在第一时间暴露出来

四、泛型擦除

虽然在 JDK1.5 之后有了泛型,但其实JDK的底层实现还是用的上面Object来实现的

如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sB60DwZz-1646265098596)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20211210185132787.jpg)]

我们虽然用的是泛型,但其实泛型只存在于编译阶段,在编译过程中也伴随着泛型擦除,在生成.class文件的时候泛型信息就已经不存在了,成了JDK1.5之前的Object方式

查看MyArrayList的字节码文件就可以看出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCvl7iYr-1646265098598)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20220123202400988.jpg)]

所以Java的泛型只存在于编译阶段(Java核心原理:Object引用可以指向任意类型的对象)

五、包装类

由于8种基本类型不是类型,Java专门为它们定义了各自的包装类

如下:

byte java.lang.Byte
short java.lang.Short
char java.lang.Character
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
boolean java.lang.Boolean

六、装箱拆箱

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsPrxxd0-1646265098599)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20220212173816723.jpg)]

Java中提供了便利,如果没有歧义,Java 会帮我们自动装箱,自动拆箱


Integer a = 10;   // 把int赋值给Integer类型,隐含着发生了装箱过程
int b = a;      // 把Integer赋值给int类型,隐含着发生了拆箱过程

隐式装箱和拆箱过程只存在于编译阶段,编译完成就变成显式装箱,显式拆箱了

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

--结束END--

本文标题: Java 泛型考古 泛型擦除 包装类详细解析

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

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

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

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

下载Word文档
猜你喜欢
  • Java 泛型考古 泛型擦除 包装类详细解析
    目录一. 什么是泛型二. 为什么要有泛型 ?示例三、泛型考古四、泛型擦除五、包装类六、装箱拆箱一. 什么是泛型 泛型(generic type)其本质是将类型参数化,也就是说所操作的...
    99+
    2022-11-13
  • Java的类型擦除式泛型详解
    Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw...
    99+
    2022-11-12
  • Java泛型之类型擦除实例详解
    目录前言泛型是什么?泛型的定义和使用泛型类泛型方法泛型类与泛型方法的共存现象泛型接口通配符?无限定通配符<><extendsT>类型擦除类型擦除带来的局限性泛...
    99+
    2022-11-13
  • Java泛型的类型擦除示例详解
    目录前言泛型的类型擦除原则是:1 擦除类定义中的类型参数1.1 无限制类型擦除1.2 有限制类型擦除2 擦除方法定义中的类型参数3 桥接方法和泛型的多态总结参考资料前言 Java泛型...
    99+
    2022-11-12
  • Java泛型的类型擦除怎么理解
    今天小编给大家分享一下Java泛型的类型擦除怎么理解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2022-10-19
  • 详解java 中泛型中的类型擦除和桥方法
    在Java中,泛型的引入是为了在编译时提供强类型检查和支持泛型编程。为了实现泛型,Java编译器应用类型擦除实现:       1、  用类型参数(type parame...
    99+
    2023-05-31
    java 泛型 桥方法
  • 详解Java泛型中类型擦除问题的解决方法
    以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List&nbs...
    99+
    2022-11-13
  • Java泛型中类型擦除问题怎么解决
    这篇“Java泛型中类型擦除问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java泛型中类型擦除问题怎么解决”文...
    99+
    2023-06-30
  • Java语法关于泛型与类型擦除的分析
    泛型与类型擦除 泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。这种参数类型可用在: 类...
    99+
    2022-11-12
  • Java 泛型详解(超详细的java泛型方法解析)
    目录2. 什么是泛型3. 使用泛型的好处4. 泛型的使用4.1 泛型类4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高级使用6. 总结1. 为什...
    99+
    2022-11-12
  • 详细全面解析Java泛型
    1.概述 作为一个面向对象的编程语言,Java可以通过实现一些类,作为我们各种需求的一个模板,方便我们的使用。但有时候,这个类的范围可能比我们想要的范围要大,我们只想限定于满足类的某...
    99+
    2022-11-13
  • Java详细分析讲解泛型
    目录1.泛型概念2.泛型的使用2.1泛型类语法2.2泛型方法语法2.3泛型接口语法2.4泛型在main方法中的使用3.擦除机制4.泛型的上界5.通配符5.1通配符的上界5.2通配符的...
    99+
    2022-11-13
  • Java泛型与包装类实例分析
    今天小编给大家分享一下Java泛型与包装类实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什么是泛型泛型的本质是为...
    99+
    2023-06-29
  • Java中关于泛型、包装类及ArrayList的详细教程
    目录一、泛型1.1 泛型类的定义1.2 泛型类的使用1.3 泛型总结二、包装类2.1基本数据类型和包装类直接的对应关系2.2 包装类的使用,装箱(boxing)和拆箱(unboxin...
    99+
    2022-11-12
  • 泛型的类型擦除后fastjson反序列化时如何还原详解
    目录铺垫错误写法1错误写法2正确写法TypeReference验证扩展铺垫 在前面的文章中,我们讲过Java中泛型的类型擦除,不过有小伙伴在后台留言提出了一个问题,带有泛型的实体的反...
    99+
    2022-11-13
    fastjson反序列化还原 泛型类型擦除
  • Java深入浅出讲解泛型与包装类
    目录1、什么是泛型2、泛型的语法3、泛型的上界4、通配符(1)通配符的上界(2)通配符的下界5、包装类1、什么是泛型 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作