包装类简单认识泛型

embedded/2024/9/24 8:25:02/

文章目录

  • 包装类
    • 基本数据类型和对应的包装类
    • 装箱和拆箱
    • 自动装箱和自动拆箱
  • 什么是泛型
  • 引出泛型
    • 语法
  • 泛型类的使用

包装类

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

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

在这里插入图片描述
除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。

装箱和拆箱

int i = 10;// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
Integer ii = Integer.valueOf(i);
Integer ij = new Integer(i);// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int j = ii.intValue();

自动装箱和自动拆箱

可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制

int i = 10;Integer ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

在这里插入图片描述

什么是泛型

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

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

引出泛型

我们希望代码只能够持有一种数据类型。而不是同时持有这么多类型。所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。

语法

class 泛型类名称<类型形参列表> {// 这里可以使用类型参数
}class ClassName<T1, T2, ..., Tn> {  
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {// 这里可以使用类型参数
}class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {// 可以只使用部分类型参数
}
class MyArray<T> {public T[] array = (T[])new Object[10];//1public T getPos(int pos) {return 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<>();//2myArray.setVal(0,10);myArray.setVal(1,12);int ret = myArray.getPos(1);//3System.out.println(ret);}
}
  • 注释1处,不能new泛型类型的数组

T[] ts = new T[5];//是不对的

  • 注释2处,类型后加入 指定当前类型
  • 注释3处,不需要进行强制类型转换

泛型类的使用

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
MyArray<Integer> list = new MyArray<Integer>();

注意:泛型只能接受类,所有的基本数据类型必须使用包装类!
当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

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

在这里插入图片描述


http://www.ppmy.cn/embedded/14926.html

相关文章

go版本1.16.5 运行项目出现undefined: math.MaxInt报错

问题描述 go版本 go1.16.5 项目引用了 包go-sqlite3 v1.14.17 github.com/mattn/go-sqlite3 v1.14.17运行报错 # github.com/mattn/go-sqlite3 D:\GoPATH\pkg\mod\github.com\mattn\go-sqlite3v1.14.17\sqlite3_opt_serialize.go:41:26: undefined: math.MaxInt原因分析&…

C++11 数据结构6 栈的链式存储,实现,测试

栈顶放在链表的头部 栈顶放在链表的头部还是尾部呢&#xff1f; 需要栈 是特殊的线性表&#xff0c;那么我们回忆一下 线性表的链式存储的插入和删除的写法&#xff0c;就应该能理清线性表的头部做为栈顶 合适 还是 线性表的尾部 作为栈顶合适 插入算法 核心代码 //正式插入…

linux下查看网络路由信息,找到请求过多的IP

netstat -nat|awk {print} |awk -F : {print$1} |sort|uniq -c |sort -n 命令netstat -nat|awk {print} |awk -F : {print$1} |sort|uniq -c |sort -n是用于分析网络连接状态的管道命令序列。下面逐个解释每个命令及其作用&#xff1a; netstat -nat: netstat 是一个用于显示…

算法训练营day22

一、二叉搜索树的最近公共祖先 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//得到p q的最大值&#xff0c;跟root比较//max < root 向左遍历 &#xff0c;max > root 继续比较 min > root 向右遍历; min < r…

Node.js -- fs模块

文章目录 1. 写入文件1.1 写入文件1.2 同步和异步1.3 文件追加写入1.4 流式写入1.5 文件写入的场景 2. 读取文件2.1 异步和同步读取2.2 读取文件应用场景2.3 流式读取2.4 fs 练习 -- 文件复制 3. 文件重命名和移动4. 文件删除5. 文件夹操作5.1 创建文件夹5.2 读取文件夹5.3 删除…

通过阿里云OOS实现定时备份redis实例转储到OSS

功能背景 随着企业业务数据的快速增长&#xff0c;Redis 作为高性能的内存数据存储方案&#xff0c;在多种应用场景下承担着重要的角色。为确保数据安全&#xff0c;定时备份成为了不可或缺的一环。Redis 实例定时备份是关键数据库管理任务的一个重要组成部分&#xff0c;它主…

Flask项目部署

1.debug模式 不用每次保存后重新运行&#xff08;热部署&#xff09; 看一下自己的ip ipconfig2.改host 可以让同一个局域网的人访问 3.修改port端口号 中间有空格

uniapp 小程序 多张图片生成海报以及下载海报

uniapp 小程序 多张图片生成海报以及下载海报 上代码 export default {data() {return {unit: 0,imgurl:"", // 海报图片shareimg:"https://eshopfile.zhiyousx.com/2022051811164947691.jpg", //背景图qrcode :"", // 二维码saveTop:80,}},on…