JAVA中包装类和泛型 通配符

news2025/2/26 11:04:23

目录

1. 包装类

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

1.2 装箱和封箱

1.3 自动自动装箱和封箱

2. 什么是泛型

3. 引出泛型

3.1 语法

4. 泛型类的使⽤

4.1 语法

4.2 ⽰例

4.3 类型推导(Type Inference)

5 泛型的上界

5.1 语法

6. 通配符

6.1 通配符解决什么问题

6.2 通配符上界

6.3 通配符下界


1. 包装类

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

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

出了Integer和Characterr,其余基本类型的包装类都是⾸字⺟⼤写。

1.2 装箱和封箱

虽然包装类,确实是类。在使用的时候,进行算数运算的时候,还需要转换成内置类型进行计算。

包装类和内置类型转换

内置类型     ————》   包装类        装箱

包装类        ————》   内置类型     拆箱

1.3 自动自动装箱和封箱

从JAVA8开始就可以实现自动装箱和拆箱。

public class Test1 {
    public static void main(String[] args) {
        //内置类型,复制给包装类,自动装箱
        Integer a = 10;
        //包装类,赋值给内置类型,自动拆箱
        int b = a;
    }
}

进行算数运算

public class Test1 {
    public static void main(String[] args) {
//        //内置类型,复制给包装类,自动装箱
//        Integer a = 10;
//        //包装类,赋值给内置类型,自动拆箱
//        int b = a;
        Integer a = 10;
        Integer b = 20;
        System.out.println(a+b);
    }
}

这里的a+b是针对两个Integr先进行转换成int,在进行计算。自动拆箱(其实就是隐士类型转换)。

对于包装类来说直接拿过来用即可。当作内置类型。不过有些地方只能用包装类,不能用内置类型。

2. 什么是泛型

⼀般的类和⽅法,只能使⽤具体的类型: 要么是基本类型,要么是⾃定义的类。如果要编写可以应⽤于多种类型的代码,这种刻板的限制对代码的束缚就会很⼤
                                                                      ----- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引⼊的新的语法,通俗讲泛型:就是适⽤于许多许多类型。从代码上讲,就是对类型实现了参数化。

3. 引出泛型

实现⼀个类,类中包含⼀个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员⽅法返回数组中某个下标的值
1. 我们以前学过的数组,只能存放指定类型的元素。
例如:
int[] array = new int[10];
String[] strs = new String[10];

3.1 语法

基础写法:
class 泛型类名称<类型形参列表> {
// 这⾥可以使⽤类型参数

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

其他写法:

class 泛型类名称<类型形参列表> extends 继承类/* 这⾥可以使⽤类型参数 */ {
// 这⾥可以使⽤类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使⽤部分类型参数
}

4. 泛型类的使⽤

4.1 语法

泛型类<类型实参> 变量名; // 定义⼀个泛型类引⽤
new 泛型类<类型实参>(构造⽅法实参); // 实例化⼀个泛型类对象

4.2 ⽰例

MyArray<Integer> list = new MyArray<Integer>();
注意:泛型只能接受类,所有的基本数据类型必须使⽤包装类!
//<T>就是“参数类型”
//T就是一个类型,相当于是:“形参”
class ArrayTemplate<T> {
    //此时arr是T[]类型,T是类型?还不知道,得在后边实例化的时候才能知道。
    //由于T类型未知,不能直接new T[]    类型转换
    private T[]arr = (T[]) new Object[10];
    public T get(int index){

        return arr[index];
    }
    public void set (int index ,T value){
        arr[index] = value;
    }


}
public class Test2 {
    //针对上述ArrayTemplate进行实例化
    //反省参数类型T就指定为Integer
    //针对arr1来说,只能储存Integer类型的数据
    ArrayTemplate<Integer> arr1 = new ArrayTemplate<Integer>();

    //泛型参数类型 T 就指定为String
    //针对Arr2 来说,就只能存储 String 类型的数据
    ArrayTemplate<String> arr2 = new ArrayTemplate<String>();

    //针对arr3来说,就只能存储Book类型
    ArrayTemplate<Book> arr3 = new ArrayTemplate<Book>();

}

针对泛型参数来说,只能指定引用类型,不能指定内置类型。

4.3 类型推导(Type Inference)

当编译器可以根据上下⽂推导出类型实参时,可以省略类型实参的填写
MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为Integer
⼩结:
1. 泛型是将数据类型参数化,进⾏传递
2. 使⽤ <T> 表⽰当前类是⼀个泛型类。
3. 泛型⽬前为⽌的优点:数据类型参数化,编译时⾃动进⾏类型检查和转换

泛型的上界

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

5.1 语法

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

实例:

public class MyArray<T extends Number> {
     ...
}

 只接受 Number 的⼦类型作为 T 的类型实参

​

public class Test3 <T extends Number>{
    public static void main(String[] args) {
        Test3<Integer> t1 = new Test3<>();
        Test3<Double> t2 = new Test3<>();
        Test3<Float> t3 = new Test3<>();

        //String类型不是Number的子类
        // Test3<String> t4 = new Test3<>();

    }

}

​

6. 通配符

? ⽤于在泛型的使⽤,即为通配符

6.1 通配符解决什么问题

在"?"的基础上⼜产⽣了两个⼦通配符:
? extends 类:设置通配符上限
? super 类:设置通配符下限

6.2 通配符上界

语法:
<? extends 上界>
<? extends Number>//可以传⼊的实参类型是Number或者Number的⼦类
public class Test4 <T> {
    public static void main(String[] args) {
//        Test4<Integer> t = new Test4<>();
//
//        t = new Test4<String>();

        //这个情况,T来说,无论是啥参数类型 ,都可以通过t来指向
        //此处 ? 称为通配符。
//        Test4<?> t = new Test4<>();
//
//        t = new Test4<String>();


        //指定了通配符的上界
        //此时的t 可以指向泛型参数为Number 及其子类的情况

        Test4<? extends Number> t = new Test4<>();
        t = new Test4<Double>();

//       错误写法,String不是NUmber的子类
        t = new Test4<String>();
   }
}

6.3 通配符下界

语法

<? super 下界>
<? super Integer>//代表 可以传⼊的实参的类型是Integer或者Integer的⽗类类型


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

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

相关文章

Qt TCP服务端和客户端程序

1、服务端程序 利用QtCreator新建QMainWindow或QWidget工程&#xff0c;绘制UI如下所示。 mainwindow.h代码如下&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket> #include &l…

level2Day5

Makefile make是工程管理器 先写了1个f1.c里面写了一个函数 然后f2.c里面也写了一个函数 还有一个头节点 又写了一个makefile的函数 输入make编译&#xff0c;但是我没装make需要装一下。 sudo apt install make 然后make&#xff0c; Makefile变量的使用 通过赋值&#xff…

minio作为K8S后端存储

docker部署minio mkdir -p /minio/datadocker run -d \-p 9000:9000 \-p 9001:9001 \--name minio \-v /minio/data:/data \-e "MINIO_ROOT_USERjbk" \-e "MINIO_ROOT_PASSWORDjbjbjb123" \quay.io/minio/minio server /data --console-address ":90…

redis小记

redis小记 下载redis sudo apt-get install redis-server redis基本命令 ubuntu16下的redis没有protected-mode属性&#xff0c;就算sudo启动&#xff0c;也不能往/var/spool/cron/crontabs写计划任务&#xff0c;感觉很安全 #连接到redis redis-cli -h 127.0.0.1 -p 6379 …

计算机视觉(opencv-python)入门之图像的读取,显示,与保存

在计算机视觉领域&#xff0c;Python的cv2库是一个不可或缺的工具&#xff0c;它提供了丰富的图像处理功能。作为OpenCV的Python接口&#xff0c;cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV CV2常用图像处理方…

ActiveMQ之VirtualTopic

一句话总结&#xff1a; VirtualTopic是为了解决持久化模式下多消费端同时接收同一条消息的问题。 现实中多出现这样一个场景&#xff1a; 生产端产生了一笔订单&#xff0c;作为消息MessageOrder发了出去。 这笔订单既要入订单系统归档&#xff0c;又要入结算系统收款&#x…

UE5 Computer Shader学习笔记

首先这里是绑定.usf文件的路径&#xff0c;并声明是用声明着色器 上面就是对应的usf文件路径&#xff0c;在第一张图进行链接 Shader Frequency 的作用 Shader Frequency 是 Unreal Engine 中用于描述着色器类型和其执行阶段的分类。常见的 Shader Frequency 包括&#xff1a…

2.1部署logstash:9600

实验环境&#xff1a;关闭防火墙&#xff0c;完成java环境 yum -y install wget wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.rpm yum localinstall jdk-8u341-linux-x64.rpm -y java -version 1.安装logstash tar xf logstash-6.4.1.tar.gz -C /usr/local…

SQL笔记#集合运算

目录 一、表的加减法 1、什么是集合运算 2、表的加法——UNION 3、集合运算的注意事项 4、包含重复行的集合运算——ALL运算 5、选取表中公共部分——INTERSECT 6、记录的减法——EXCEPT 二、联结(以列为单位对表进行联结) 1、什么是联结(JOIN) 2、内联结——INSER…

多模态人物视频驱动技术回顾与业务应用

一种新的商品表现形态&#xff0c;内容几乎存在于手淘用户动线全流程&#xff0c;例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力&#xff0c;能够从供给端缓解内容生产成本高的问题&#xff0c;通过源源不断的低成本供给倒推…

多功能免费网络测速及问题诊断工具

​软件介绍 在日常网络使用中&#xff0c;网络问题常常难以即时察觉&#xff0c;很多时候&#xff0c;只有当视频卡顿、网页加载半天没反应&#xff0c;乃至无法连接部分服务时&#xff0c;我们才惊觉网络出状况了。 这里有一款免费工具&#xff0c;专为家庭、办公以及跨国网…

【算法设计与分析】(一)介绍算法与复杂度分析

【算法设计与分析】&#xff08;一&#xff09;介绍算法与复杂度分析 前言一、什么是算法&#xff1f;二、算法的抽象机制三、描述算法四、复杂度分析4.1 时间复杂度4.2 空间复杂度 前言 从搜索引擎的高效检索&#xff0c;到推荐系统的个性化推荐&#xff0c;再到人工智能领域…

HTML5特殊字符

HTML中常用的特殊符号一般都以“&”开头&#xff0c;以“;”结束。

使用python接入腾讯云DeepSeek

本文主要从提供SSE方式接入DeepSeek&#xff0c;并通过fastapi websocket对外提供接入方法。 参考文档&#xff1a; 腾讯云大模型&#xff1a;https://cloud.tencent.com/document/product/1759/109380 fastAPI官网&#xff1a;https://fastapi.tiangolo.com/ WebSocketManager…

无法打开数据库 CAUsers\Public\EPLAN(Data\翻译\Company name\Translate.mdb。

eplan生成更新列表后报错&#xff0c;报错内容如下&#xff1a; 无法打开数据库 CAUsers\Public\EPLAN(Data\翻译\Company name\Translate.mdb。针对 64 位版本的EPLAN平台需要使用64 位版本的Microsoft Office。 原因&#xff1a;eplan的列表更新需要64位的微软办公软件版本支…

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下&#xff0c;LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT&#xff0c;通常是图像格式的 LUT 文件。下面&#xff0c;我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换&#xff08;不是8x8网络&#xff09;&am…

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…

FS800DTU联动OneNET平台数据可视化View

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件环境 2.3 硬件连接 3 注册OneNET云平台并建立物模型 3.1 参数获取 3.2 连接OneNET 3.3上报数据 4 数据可视化View 4.1 用户信息获取 4.2 启用数据可视化View 4.3 创建项目 4.4 编辑项目 4.5 新增数据源 4.6 数据过滤器配置 4.6 项…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

[数据结构笔记]数据结构必要的C语言基础

数据结构必要的C语言基础 使用C语言学习数据结构之前有一些必要了解的基础&#xff0c;许多同学在初学数据结构时因为对这些知识不熟&#xff0c;导致了对数据结构的畏惧心理。实际上很大一部分来自C语言的基础 C语言 结构体与指针 ​ 在一些场景中&#xff0c;如果传递给函…