当前位置: 首页 > news >正文

【Java】泛型的简单使用

文章目录

  • 一、包装类
    • 1.基本数据类型和对应的包装类
    • 2.自动装箱和自动拆箱
    • 3.手动装箱和手动拆箱
  • 二、什么是泛型
  • 三、泛型的使用
  • 四、裸类型(Raw Type)
  • 五、泛型是如何编译的
  • 六、泛型的上界
  • 七、泛型方法
  • 总结


一、包装类

在了解泛型之前我们先了解什么是包装类,在Java中由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型

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

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

除了IntegerCharacter,其余基本类型的包装类都是首字母大写

2.自动装箱和自动拆箱

public class Test {public static void main(String[] args) {int a = 10;Integer i = a;//自动装箱 把一个基本数据类型转变为包装类型System.out.println(i);Integer j = new Integer(20);int b = j;//自动拆箱 把一个包装类型转变为基本数据类型System.out.println(b);}
}

在这里插入图片描述

3.手动装箱和手动拆箱

public class Test {public static void main(String[] args) {int a = 10;Integer i = Integer.valueOf(a);//手动装箱System.out.println(i);Integer j = new Integer(20);int b = j.intValue();//手动拆箱System.out.println(b);}
}

在这里插入图片描述

二、什么是泛型

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象,让编译器去做检查
语法:

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];//1public void setValue(int pos,T val) {array[pos] = val;}public T getValue(int pos) {return(T)array[pos];}
}
public class Test {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();//2myArray.setValue(0,10);myArray.setValue(1,20);myArray.setValue(2,30);int val = myArray.getValue(0);//3System.out.println(val);MyArray<String> myArray1 = new MyArray<>();myArray1.setValue(0,"hello");myArray1.setValue(1,"word");String ret = myArray1.getValue(0);System.out.println(ret);}
}    

在这里插入图片描述
1.类名后的< T >代表占位符,表示当前类是一个泛型类
【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型
2. 注释1处,不能new泛型类型的数组
3. 注释2处,类型后加入 < Integer > 指定当前类型
4. 注释3处,不需要进行强制类型转换

三、泛型的使用

语法:

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

示例如下:

MyArray<Integer> myArray = new MyArray<Integer>();//此处的类型实参可以省略

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

四、裸类型(Raw Type)

裸类型是一个泛型类但没有带着类型实参,如下所示:

MyArray myArray = new MyArray();

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

五、泛型是如何编译的

擦除机制:
在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息

六、泛型的上界

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

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

示例:

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

只接受 Number 的子类型作为 E 的类型实参
复杂示例:

public class MyArray<E extends Comparable<E>> {
...
}

E必须是实现了Comparable接口的

七、泛型方法

定义语法:

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { 
... 
}

示例:

public class Util {//静态的泛型方法 需要在static后用<>声明泛型类型参数public static <E> void swap(E[] array, int i, int j) {E t = array[i];array[i] = array[j];array[j] = t;}
}

总结

1.泛型是将数据类型参数化,进行传递
2.使用 < T > 表示当前类是一个泛型类。
3.泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

相关文章:

【Java】泛型的简单使用

文章目录 一、包装类1.基本数据类型和对应的包装类2.自动装箱和自动拆箱3.手动装箱和手动拆箱 二、什么是泛型三、泛型的使用四、裸类型&#xff08;Raw Type&#xff09;五、泛型是如何编译的六、泛型的上界七、泛型方法总结 一、包装类 在了解泛型之前我们先了解什么是包装类…...

注册Zoho Mail邮箱:优势与使用体验

如何注册Zoho Mail邮箱&#xff1f;要注册Zoho Mail邮箱&#xff0c;首先打开浏览器&#xff0c;访问Zoho Mail官网&#xff0c;点击页面右上角的“创建帐户”按钮。接下来&#xff0c;按照提示输入你的姓名、生日和性别&#xff0c;以及一个有效的手机号码或电子邮件地址。然后…...

第十四届蓝桥杯大赛国赛模拟题C++卷1

第十四届蓝桥杯大赛国赛模拟题C++卷1 一、选择题 1、在数组中,数组名表示( ) A.数组第1个元素的首地址 B.数组第2个元素的首地址 C.数组所有元素的首地址 D.数组最后1个元素的首地址答案:A.数组名是一个地址,指向第一个元素 2、下列叙述中正确的是( ) A.顺序存储结构的…...

基于UDP的TFTP文件传输

代码&#xff1a; #include <myhead.h>//实现下载功能 int download(int cfd,struct sockaddr_in sin) {char buf[516] ""; //定义资源包char fileName[128] ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName…...

抵御代码重用攻击:指针认证(PAC)和分支目标识别(BTI)

目录 一、代码重用攻击历史 二、小工具(Gadgets):它们是什么?为什么它们很危险? 三、ROP攻击...

业务逻辑漏洞

业务逻辑漏洞 扫描器扫不出来 漏洞包括 暴力破解任意用户/密码登陆短信/邮箱轰炸验证码绕过/爆破/重放/回传用户名/手机号枚举(用户名枚举&#xff1a;当用户登录时&#xff0c;显示用户名不存在&#xff0c;或密码不正确&#xff0c;两个其中一个不正确就称为用户名枚举)越…...

Vue框架学习笔记——计算属性

文章目录 前文提要代码需求描述插值语法实现methods实现 计算属性getter执行时间&#xff1a;setter 计算属性简写形式&#xff08;只读不改&#xff0c;才能如此简写&#xff09;slice截取元素&#xff0c;限制输入字符数量 前文提要 本人仅做个人学习记录&#xff0c;如有错…...

初识PO模式并在Selenium中简单实践

初识PO模式 PO&#xff08;PageObject&#xff09;是一种设计模式。简单来说就是把一些繁琐的定位方法、元素操作方式等封装到类中&#xff0c;通过类与类之间的调用完成特定操作。 PO被认为是自动化测试项目开发实践的最佳设计模式之一。 在学习PO模式前&#xff0c;可以先…...

读书笔记:彼得·德鲁克《认识管理》第35章 以任务和工作为中心的设计

一、章节内容概述 如今我们已经拥有五种不同的组织设计原则&#xff0c;其中每一种都能够满足若干设计规范&#xff0c;但任何一种都不能满足所有规范;其中每一种都有自身的优势、劣势和对效果的严格要求&#xff0c;都蕴含着特定的组织设计逻辑。其中前两种设计原则&#xff…...

算法基础课 (一) 基础算法

进制转换 #include<iostream> using namespace std; const int N 100; int n,m; string s; int x;//记录n进制转化成十进制; int ans[N]; int main(){cin>>n>>s>>m;int t1;for(int is.size()-1;i>0;i--){if(s[i]<A){x t*(int)(s[i]-0);t * n;…...

【Python】jieba分词基础

jieba分词主要有3种模式&#xff1a; 1、精确模式&#xff1a;jieba.cut(文本, cut_allFalse) 2、全模式&#xff1a;jieba.cut(文本, cut_allTrue) 3、搜索引擎模式&#xff1a;jieba.cut_for_search(文本) 分词后的关键词提取&#xff1a; jieba.analyse.textrank(txt,t…...

使用jmeter对接口进行简单测试

JMeter是一个开源的性能测试工具&#xff0c;它可以对于Web应用程序、FTP、数据库服务器等各种服务器进行性能测试和负载测试&#xff0c;以确定它们是否能够承受预期的负载。JMeter支持多种协议和技术&#xff0c;如HTTP、HTTPS、FTP、JDBC、LDAP、SOAP、JMS等。它使用Java编写…...

成长在于积累——https 认证失败的学习与思考

1. 引言 本周二长城项目在收尾过程中&#xff0c;出现了一个车端无法进行注册的问题&#xff1a;curl提示证书认证失败&#xff08;其实已经能确认问题方向了&#xff0c;运维人员去确认证书问题即可&#xff09;。虽然最终的原因是由于长城运维人员导致的。但是这个过程让我颇…...

C语言——数字金字塔

实现函数输出n行数字金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void pyramid(int n) {int i,j,k;for (i1; i<n; i){//输出左边空格&#xff0c;空格数为n-i for (j1; j<n-i; j){printf(" "); } //每一行左边空格输完后输出数字&#…...

关于 typedef 的用法

typedef 是 C 和 C 语言中的关键字&#xff0c;用于创建类型的别名。它的主要作用是给一个已有的类型定义一个新的名称&#xff0c;以提高代码的可读性和可维护性。下面是 typedef 的几种常见用法&#xff1a; 用于给基本类型定义别名&#xff1a; typedef int myint;上述代码…...

Webshell流量分析

Webshell流量分析 常见的一句话木马: asp一句话 <%eval request("pass")%> aspx一句话 <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> php一句话 <?php @eval($_POST["pass&…...

高级IO—poll,epoll,reactor

高级IO—poll,epoll,reactor 文章目录 高级IO—poll,epoll,reactorpoll函数poll函数接口poll服务器 epollepoll的系统调用epoll_createepoll_ctlepoll_wait epoll的工作原理epoll的工作方式水平触发边缘触发 epoll服务器 reactor poll函数 poll函数是一个用于多路复用的系统调…...

一文详解Python中常用数据类型

文章目录 Python 中常用的数据类型包括&#xff1a;Python 中布尔类型(bool)Python 中的数字类型概述Pyhon中的字符串概述Python 中的List概述Python 中的元组类型(tuple)Python中的字典&#xff08;Dictionary&#xff09;Python中的集合&#xff08;Set&#xff09;Python中的…...

【MATLAB源码-第85期】基于farrow结构的滤波器仿真,截止频率等参数可调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Farrow结构是一种用于实现可变数字滤波器的方法&#xff0c;尤其适用于数字信号处理中的采样率转换和时变滤波。它通过多项式近似来实现对滤波器系数的平滑变化&#xff0c;使得滤波器具有可变的群延时或其他参数。 Farrow结…...

ChatGPT Plus/GPT4高级数据分析和插件功能详解

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…...

C++27 std::atomic_ref与memory_order_relaxed新用法:3个被90%工程师忽略的零开销优化场景

第一章&#xff1a;C27 std::atomic_ref与memory_order_relaxed的演进本质C27 将对原子操作基础设施进行关键性增强&#xff0c;其中 std::atomic_ref 的语义扩展与 memory_order_relaxed 的行为精化共同揭示了现代硬件内存模型与抽象编程模型之间持续收敛的本质。相较于 C20 中…...

在Rockchip RK3588开发板上,用MPP库把H264视频转成YUV文件(附完整代码和避坑点)

在RK3588开发板上用MPP实现H264到YUV的高效解码实战 当我在RK3588开发板上第一次成功将H264视频流实时解码为YUV420SP格式时&#xff0c;那种成就感至今难忘。作为瑞芯微旗舰级芯片&#xff0c;RK3588的媒体处理能力在嵌入式领域堪称强悍&#xff0c;而MPP&#xff08;Media Pr…...

程序员转型AI:大模型时代算法工程师的三种发展路径

程序员转型AI&#xff1a;大模型时代算法工程师的三种发展路径时代变了&#xff1a;从"稀缺资源"到"工业级生产资料" 在没有大模型的时代&#xff08;其实也就两三年前&#xff09;&#xff0c;算法工程师是干嘛的&#xff1f;那时候&#xff0c;模型是&qu…...

公众号流量分成大涨!后公众号时代如何运营?流量商店旗下的互粉平台成增粉利器!

“上个月流量主收入终于突破5000元了&#xff01;”深夜&#xff0c;运营“职场进化论”公众号的小林在朋友圈晒出后台截图。一年前&#xff0c;这个只有几百粉丝的账号月收入还不到100元。而如今&#xff0c;像小林这样依靠公众号流量分成实现可观收入的创作者正越来越多。 20…...

基于SpringBoot + Vue的人工智能时代个人计算机的安全防护科普系统

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…...

ANDON系统赋能自行车制造实现异常闭环管理

传统自行车制造业面临着多工位协同效率低、异常响应滞后等痛点。以某自行车制造工厂为例&#xff0c;其生产线涵盖车架组装、轮组调试、整车检测等多环节&#xff0c;传统异常管理存在响应滞后、协同混乱、数据缺失三大瓶颈。引入ANDON系统后&#xff0c;通过构建“工位触发-网…...

GObject框架:C语言的面向对象编程实践

1. GObject框架概述GObject作为GLib库的核心组件&#xff0c;为C语言开发者提供了一套完整的面向对象编程范式。这个框架完美解决了C语言缺乏原生面向对象支持的痛点&#xff0c;让开发者能够在保持C语言高效性的同时&#xff0c;享受到面向对象编程的诸多优势。我在实际项目中…...

变深声纳(VDS)收放系统技术情报报告

1. 系统概述 变深声纳(Variable Depth Sonar, VDS)是现代反潜战(ASW)的关键传感器技术,通过将声纳拖体部署到舰艇下方一定深度,避开表层温跃层和舰艇自噪声,实现对常规潜艇的有效探测。VDS收放系统是确保声纳拖体安全部署、精确定位和可靠回收的核心机械系统。 2. 拖曳…...

如何用klein.php构建RESTful API:10个实用技巧与最佳实践

如何用klein.php构建RESTful API&#xff1a;10个实用技巧与最佳实践 【免费下载链接】klein.php A fast & flexible router 项目地址: https://gitcode.com/gh_mirrors/kl/klein.php klein.php是一款轻量级且高性能的PHP路由库&#xff0c;专为构建快速灵活的Web应…...

如何快速实现Brick Design国际化:构建多语言应用的完整指南

如何快速实现Brick Design国际化&#xff1a;构建多语言应用的完整指南 【免费下载链接】brick-design 低代码框架&#xff0c;支持流式布局与自由布局拖拽编排&#xff0c;可视化拖拽、随意嵌套组合、实时渲染、实时辅助线展示、自由布局支持辅助对齐、支持自动吸附、实时组件…...