包装类和简单泛型

news2024/11/29 1:30:38

一、包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

1.1 基本数据类型和对应的包装类

注意:除了 Integer Character其余基本类型的包装类都是首字母大写。 

1.2 装箱和拆箱

装箱操作:新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中

拆箱操作:将 Integer 对象中的值取出,放到一个基本数据类型中

int i = 10;

// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
Integer ii = Integer.valueOf(i);
Integer ij = new Integer(i);

// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
 int j = ii.intValue();

1.3 自动装箱和自动拆箱 

装箱和拆箱带来不少的代码量,为了减少开发者的负担,java 提供了自动机制,即自动装箱和拆箱

int i = 10;

Integer ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱

int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

       

二、认识泛型 

2.1 什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。

----- 来源《Java编程思想》对泛型的介绍

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

2.2 引出泛型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?

思路:

1. 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];

2. 所有类的父类,默认为Object类。数组是否可以创建为Object?

示例:

class MyArray {
    public Object[] array = new Object[10];
    public Object getPos(int pos) {
        return this.array[pos];
    }
    public void setVal(int pos,Object val) {
        this.array[pos] = val;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        MyArray myArray = new MyArray();
        myArray.setVal(0,10);
        myArray.setVal(1,"hello");//字符串也可以存放
        String ret = myArray.getPos(1);//编译报错
        System.out.println(ret);
    }
}

问题:以上代码实现后发现 

1. 任何类型数据都可以存放

2. 1号下标本身就是字符串,但是确编译报错。必须进行强制类型转换

虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

2.3 语法

class 泛型类名称<类型形参列表> {
    // 这里可以使用类型参数
}

class ClassName<T1, T2, ..., Tn> {
}

class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
    // 这里可以使用类型参数
}

class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
    // 可以只使用部分类型参数
}

上述代码进行改写如下:  

class MyArray<T> {
    public Object[] array = new Object[10];

    public T getPos(int pos) {
        return (T)this.array[pos];
    }
    public void setVal(int pos,T val) {
        this.array[pos] = val;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<>();//1
        myArray.setVal(0,10);
        myArray.setVal(1,12);
        int ret = myArray.getPos(1);//2
        System.out.println(ret);
        myArray.setVal(2,"bit");//3
    }
}

代码解释: 

1. 类名后的 <T> 代表占位符,表示当前类是一个泛型类

了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:

2. 注释2处,类型后加入 <Integer> 指定当前类型

3. 注释3处,不需要进行强制类型转换

4. 注释4处,代码编译报错,此时因为在注释2处指定类当前的类型,此时在注释4处,编译器会在存放元素的时候帮助我们进行类型检查。

2.3 泛型类的使用

语法:

泛型类类型实参> 变量名; // 定义一个泛型类引用

new 泛型类类型实参>(构造方法实参); // 实例化一个泛型类对象

示例: 

MyArrayInteger> list = new MyArrayInteger>();

注意:泛型只能接受类,所有的基本数据类型必须使用包装类! 

类型推导(Type Inference):

当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer

2.4  泛型的擦除机制

那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他,还是需要一定的时间打磨。

在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制

Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。

有关泛型擦除机制的文章截介绍:https://zhuanlan.zhihu.com/p/51452375

2.5 泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

语法:

class 泛型类名称类型形参 extends 类型边界>  {  

...

}

示例 :

public class MyArrayE extends Number>  {  

...

}

只接受 Number 的子类型作为 E 的类型实参  

MyArrayInteger> l1; // 正常,因为 Integer 是 Number 的子类型

MyArrayString> l2; // 编译错误,因为 String 不是 Number 的子类型

了解: 没有指定类型边界 E,可以视为 E extends Object  

三、裸类型(Raw Type) 

3.1 定义

裸类型是一个泛型类但没有带着类型实参,例如 MyArrayList 就是一个裸类型

MyArray list = new MyArray(); 

注意:我们不要自己去使用裸类型,裸类型是为了兼容老版本的 API 保留的机制 

3.2 小结:

1. 泛型是将数据类型参数化,进行传递

2. 使用 <T> 表示当前类是一个泛型类。

3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信怎么恢复好友?找回失联好友,5个有效方法奉上!

微信&#xff0c;这个我们日常沟通不可或缺的工具&#xff0c;但有时会因为一些小疏忽&#xff0c;让我们不小心与好友失去了联系。可能是误删了好友&#xff0c;也可能是换了手机没来得及备份&#xff0c;导致那些熟悉的面孔从列表中消失。 那么&#xff0c;微信怎么恢复好友…

软件设计师全套备考系列文章9 -- 算法设计与分析

软考-- 软件设计师&#xff08;9&#xff09;-- 算法设计与分析 文章目录 软考-- 软件设计师&#xff08;9&#xff09;-- 算法设计与分析前言一、章节考点二、分治法三、回溯法四、贪心法五、动态规划法 前言 考试时间&#xff1a;每年5月、11月&#xff0c;软件设计师每年都…

当《黑神话:悟空》中的天命人,被AI换脸成老外…

前言 挡不住&#xff0c;根本挡不住&#xff01; 《黑神话&#xff1a;悟空》&#xff0c;这款由游戏科学公司制作的&#xff0c; 以中国神话为背景的角色扮演游戏&#xff0c;8月20日一上线&#xff0c; 就连续霸榜Steam、WeGame 等平台销量榜首&#xff0c; 肉饼的朋友圈…

软件测试学习笔记丨多表查询及子查询

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31940 一、多表简介 定义&#xff1a;结合两个或多个表来执行SQL数据库操作&#xff0c;这通常涉及到一个或多个表的关联&#xff0c;基于某些共享的列&#xff08;通常是键&#xff09;之间…

C++面试基础系列-polymorphic多态性

系列文章目录 文章目录 系列文章目录C面试基础系列-polymorphic多态性Overview1.polymorphic多态性2.编译时多态的实现示例代码&#xff1a;函数重载示例&#xff1a;运算符重载示例&#xff1a;模板示例&#xff1a; 3.运行时多态的实现示例代码 4.编译时多态的优点关于作者 C…

高校考勤小程序的设计与实现---附源码131039

摘 要 随着计算机的发展及网络技术的应用&#xff0c;当今社会正快速向信息自动化社会前进&#xff0c;信息自动化的作用也闲的的尤为重要&#xff0c;特别是各行业的管理领域&#xff0c;智能化信息处理已是提高效率、规范管理、客观审查的最有效方法。近年来&#xff0c;随着…

双模显示器是什么?原来是可变化的显示屏

随着科技的进步和人们对高品质视觉体验需求的增加&#xff0c;显示技术正在经历一场深刻的变革。近年来&#xff0c;双模显示器逐渐引起了广泛关注&#xff0c;成为显示器设计的新趋势。那么什么是双模显示器呢&#xff1f;它都有哪些优势&#xff1f;下面就一起来了解一下。 …

C++学习笔记----4、用C++进行程序设计(三)---- 类间关系

作为一名程序员&#xff0c;会不可避免地碰到不同的类具有相同的特点&#xff0c;或者看起来相互之间有一定的关系。面向对象的编程语言提供许多技术来处理类间的这种关系。比较令人迷惑的部分就是理解 这些关系到底是什么&#xff1f;有两种主要的类间关系--复合关系&#xff…

【三维语义分割模型】PAConv

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

780nm扫地机器人模组出现质量问题怎么检测?

随着智能家居的普及&#xff0c;扫地机器人已成为现代家庭不可或缺的清洁助手。其中&#xff0c;780nm扫地机器人模组作为扫地机器人的核心部件之一&#xff0c;其质量和性能直接影响到扫地机器人的整体表现。然而&#xff0c;在使用过程中&#xff0c;有时会遇到模组出现质量问…

无线领夹麦克风怎么挑选?选购领夹麦克风必看的五大智商税!

在数字音频技术飞速发展的今天&#xff0c;无线领夹麦克风已经不再是遥不可及的奢侈设备&#xff0c;而逐渐成为普通人记录生活、录制音视频、乃至直播互动的得力助手。但如今市面上的麦克风多到让眼眼花缭乱&#xff0c;对于一些没有经验的新手小伙伴&#xff0c;更是不知从何…

以简单的例子从头开始建spring boot web多模块项目(二)-mybatis简单集成

继续使用以简单的例子从头开始建spring boot web多模块项目&#xff08;一&#xff09;中的项目进行mybatis集成。 1、pom.xml文件中&#xff0c;增加相关的依赖包的引入&#xff0c;分别是mybatis-spring-boot-starter、lombok、mysql-connector-java 如下&#xff1a; <d…

python实用教程(二):安装配置Pycharm及使用(Win10)

上一篇&#xff1a;python实用教程&#xff08;一&#xff09;&#xff1a;安装配置anaconda&#xff08;Win10&#xff09;-CSDN博客 1、简介及下载 PyCharm是一款功能强大的 Python 编辑器&#xff0c;具有跨平台性。是Jetbrains家族中的一个明星产品。 下载地址&#xff…

Nacos漏洞检测总结

弱口令 默认账号密码 nacos/nacos POST /nacos/v1/auth/users/login HTTP/1.1 Host: xxxx:8848 Connection: keep-alive Content-Length: 29 Accept: application/json, text/plain, */* User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like…

高效分页策略:掌握 LIMIT 语句的正确使用方法与最佳实践

本文主要介绍limit 分页的弊端及线上应该怎么用 LIMIT M,N 平时经常见到使用 <limit m,n> 合适的 order by 来实现分页查询&#xff0c;这样做到底性能如何呢&#xff1f; 先来简单分析下&#xff0c;然后再实际验证一下。 无索引条件下&#xff0c;需要做大量的文件排…

代码随想录 刷题记录-13 回溯(2)组合问题

在这里涉及到的回溯中的抽象树&#xff0c;都是“选哪一个元素”的思想。 1.第77题. 组合 回溯法就用递归来解决嵌套层数的问题。 把组合问题抽象为如下树形结构&#xff1a; 可以看出这棵树&#xff0c;一开始集合是 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c; …

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界&#xff1a;Python-prompt-toolkit的魔法背景&#xff1a;为何选择Python-prompt-toolkit&#xff1f;Python-prompt-toolkit是什么&#xff1f;如何安装Python-prompt-toolkit&#xff1f;简单使用&#xff1a;Python-prompt-toolkit的…

MongoDB Compass初体验

入坑Mongodb也好多年了&#xff0c;客户端一直都是使用的Robomongo&#xff0c;后改名为Robo 3T了&#xff0c;现在又改名为Studio 3T&#xff0c;还分了免费版和付费版。 最近换了新电脑&#xff0c;需要重新安装Mongodb的客户端&#xff0c;加上公司对安装软件的各种限制&…

国内首颗ASIL D级高端旗舰级R52+内核车规MCU发布,中国汽车芯片强势崛起

8月21日&#xff0c;在2024紫光同芯合作伙伴大会上&#xff0c;紫光同芯正式发布第二代THA6系列高端旗舰级新品THA6412。该芯片在安全性、可靠性、算力、实时性等方面全方位升级&#xff0c;是继今年7月紫光同芯发布THA6206芯片后&#xff0c;又一款通过ASIL D产品认证的旗舰级…

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…