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

【Java]认识泛型

包装类

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

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

泛型

泛型是在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];public void setArray(int pos,T val ){this.array[pos] = val;}public T getArray(int pos){return array[pos];}
}
public class Test1 {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();myArray.setArray(0,20);Integer a = myArray.getArray(0);System.out.println(a);MyArray<String> myArray1 = new MyArray<>();myArray1.setArray(0,"hallo");String b = myArray1.getArray(0);System.out.println(b);}
}

代码解释:
类名后的 <T> 代表占位符,表示当前类是一个泛型类
了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V 等等 - 第二、第三、第四个类型

泛型类的使用

语法:

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

示例:

MyArray<Integer> myArray = new MyArray<Integer>(); 

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

为什么不能实例化泛型类型的数组

举个栗子:

class MyArray<T>{public T[] array = (T[]) new Object[10];public void setArray(int pos,T val ){this.array[pos] = val;}public T getArray(int pos){return array[pos];}public T[] getArrays(){return array;}
}
public class Test1 {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();String[] array1 = (String)myArray.getArrays();}
}

我们在 MyArray 泛型类中有这样一个方法 getArrays 该方法是将该类中的数组以 T[] 泛型类型的数组返回。然后我们在主函数中用 String 类型的数组来接收。

当我们在运行时发现程序报错了,原因:替换后的方法为:将Object[]分配给String[]引用,程序报错 。也就是说返回的Object数组里面,可能存放的是任何的数据类型,可能是String,可能是Person,运行的时候,直接转给Integer类型的数组,编译器认为是不安全的。

而正确的方式是:

class MyArray<T> {public T[] array;public MyArray() {}/*** 通过反射创建,指定类型的数组* @param clazz* @param capacity*/public MyArray(Class<T> clazz, int capacity) {array = (T[])Array.newInstance(clazz, capacity);}public T getPos(int pos) {return this.array[pos];}public void setVal(int pos,T val) {this.array[pos] = val;}public T[] getArray() {return array;}
}7 泛型的上界
在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
7.1 语法
7.2 示例
只接受 Number 的子类型作为 E 的类型实参
了解: 没有指定类型边界 E,可以视为 E extends Object
7.3 复杂示例
E必须是实现了Comparable接口的
8 泛型方法
public static void main(String[] args) {MyArray<Integer> myArray1 = new MyArray<>(Integer.class,10);Integer[] integers = myArray1.getArray();
}

泛型的上界

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

语法:

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

示例:

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

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

 我们发现当定义了 Number 上界时,使用 String 包装类的时候就报错了。

当我们没有指定类型边界 E,可以视为 E extends Object。

复杂示例:传递任意一个类型数组返回其中的最大值:

class Alg<T extends Comparable<Alg>>{public T findMax(T[] array){T max = array[0];for (int i = 0; i < array.length; i++) {if(array[i].compareTo((Alg) max) > 0 ){max = array[i];}}return max;}
}
public class Test1 {public static void main(String[] args) {}
}

泛型方法

语法:

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

使用示例:传递任意类型的数组将其中两个元素交换位置

public class Test1 {public static <E> void swap(E[] array,int i,int j){E tmp = array[i];array[i] = array[j];array[j] = tmp;}public static void main(String[] args) {Integer[] array = new Integer[]{1,2,3,4,5,6,7};swap(array,0,1);System.out.println(Arrays.toString(array));}
}

 

相关文章:

【Java]认识泛型

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character&#xff0c; 其余基本类型的包装类都是首字母大写。 泛型 泛型是在JDK1.5引入的…...

git要忽略对文件的本地修改

要忽略对文件的本地修改&#xff08;即&#xff0c;使Git忽略对该文件的任何未提交更改&#xff09;&#xff0c;可以使用以下命令将该文件标记为假设未更改&#xff08;assume-unchanged&#xff09;&#xff1a; sh git update-index --assume-unchanged runtime/x64/skin/s…...

Linux学习笔记(三)文件权限

一、权限的分类 Linux权限分为r(读取)、w(写入)、x(执行)。我们在终端执行ls -l命令查看文件详细信息显示如下: [root@srv sun]# ls -l 总用量 0 drwxr-xr-x. 2 sun root 6 7月 5 14:05 公共 drwxr-xr-x. 2 sun root 6 7月 5 14:05 模板 drwxr-xr-x. 2 sun root…...

自定义类TMyLabel继承自QLabel ,实现mouseDoubleClickEvent

自定义类TMyLabel &#xff0c;继承自QLabel TMyLabel 中重新实现了 event 方法&#xff0c;重写了mouseDoubleClickEvent 发射信号 在主窗体中放入TMyLabel组件&#xff0c;将TMyLabel mouseDoubleClickEvent 信号&#xff0c; 绑定到实现方法do_doubleClick()槽函数 TMy…...

逻辑回归模型(非回归问题,而是分类问题)

目录&#xff1a; 一、Sigmoid函数&#xff1a;二、逻辑回归介绍&#xff1a;三、决策边界四、逻辑回归模型训练过程&#xff1a;1.训练目标&#xff1a;2.梯度下降调整参数&#xff1a; 一、Sigmoid函数&#xff1a; Sigmoid函数是构建逻辑回归模型的重要函数&#xff0c;如下…...

qt hasPendingDatagrams() 函数

hasPendingDatagrams 是 Qt 框架中 QUdpSocket 类的一个方法&#xff0c;用于检查是否有待处理的数据报到达。在 UDP 通信中&#xff0c;数据以数据报的形式发送&#xff0c;而 QUdpSocket 类提供了用于接收和处理这些数据报的功能。 功能描述 hasPendingDatagrams() 方法用于…...

数据结构第08小节:双端队列

双端队列&#xff08;deque&#xff0c;double-ended queue&#xff09;是一种具有队列和栈特性的数据结构&#xff0c;允许在其两端进行插入和删除操作。在Java中&#xff0c;java.util.Deque接口就是双端队列的实现&#xff0c;而ArrayDeque和LinkedList是其中的具体实现类。…...

Python骨架肌体运动学数学模型

&#x1f3af;要点 &#x1f3af;运动学矢量计算 | &#x1f3af;跳远的运动学计算 | &#x1f3af;关节肢体运动最小加加速度模型 | &#x1f3af;膝关节和踝关节角度二维运动学计算 | &#x1f3af;上下肢体关节连接运动链数学模型 | &#x1f3af;刚体连接点速度加速度计算…...

二叉树的序列化和反序列化(Java)

概述 关于面试中常见的其他二叉树算法题&#xff0c;参考面试算法之二叉树(Java)。二叉树的定义&#xff08;注意到有使用lombok提供的两个注解&#xff09;&#xff1a; lombok.Data lombok.AllArgsConstructor private static class TreeNode {private TreeNode left;priva…...

Java中的泛型类

Java中的泛类 Java 的泛型&#xff08;Generics&#xff09;是一种语言特性&#xff0c;允许你定义类、接口和方法时使用类型参数。这使得代码更具可读性和安全性&#xff0c;因为编译器能够在编译时检查类型&#xff0c;而不是在运行时。 泛型类 定义泛型类时&#xff0c;可…...

57、Flink 的项目配置概述

1&#xff09;概览 1.开始 要开始使用 Flink 应用程序&#xff0c;请使用以下命令、脚本和模板来创建 Flink 项目。 可以使用如下的 Maven 命令或快速启动脚本&#xff0c;基于原型创建一个项目。 a&#xff09;Maven 命令 mvn archetype:generate \-Darch…...

零基础自学爬虫技术该从哪里入手?

零基础学习Python并不一定是困难的&#xff0c;这主要取决于个人的学习方法、投入的时间以及学习目标的设定。Python是一门相对容易入门的编程语言&#xff0c;它有着简洁的语法、丰富的库和广泛的应用领域&#xff08;如数据分析、Web开发、人工智能等&#xff09;&#xff0c…...

Vue.js 基础入门指南

前言 在前端开发的广阔领域中&#xff0c;Vue.js 无疑是一颗璀璨的明星&#xff0c;以其渐进式框架的特性吸引了无数开发者的目光。Vue.js 旨在通过简洁的 API 实现响应式的数据绑定和组合的视图组件&#xff0c;使得构建用户界面变得既快速又简单。本文将带你走进 Vue.js 的世…...

山泰科技集团陈玉东:争当数字化时代的知识产权卫士

随着互联网和数字技术的飞速普及&#xff0c;大版权时代已经悄然到来。在这个新时代&#xff0c;信息的传播速度、广度和深度均达到了前所未有的高度&#xff0c;极大地拓展了人们的精神世界和知识视野。然而&#xff0c;这一科技发展的浪潮也为版权保护带来了前所未有的挑战。…...

WBCE CMS v1.5.2 远程命令执行漏洞(CVE-2022-25099)

前言 CVE-2022-25099 是一个影响 WBCE CMS v1.5.2 的严重安全漏洞&#xff0c;具体存在于 /languages/index.php 组件中。该漏洞允许攻击者通过上传精心构造的 PHP 文件在受影响的系统上执行任意代码。 技术细节 受影响组件&#xff1a;/languages/index.php受影响版本&…...

鸿蒙语言基础类库:【@ohos.url (URL字符串解析)】

URL字符串解析 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…...

【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构

模型地址&#xff1a;https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/vae 主要参考:Using-Stable-Diffusion-VAE-to-encode-satellite-images sd1.4 vae 下载到本地 from diffusers import AutoencoderKL from PIL import Image import torch import to…...

《警世贤文》摘抄:守法篇、惜时篇、修性篇、修身篇、待人篇、防人篇(建议多读书、多看报、少吃零食多睡觉)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140243440 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

vue2+element-ui新增编辑表格+删除行

实现效果&#xff1a; 代码实现 &#xff1a; <el-table :data"dataForm.updateData"border:header-cell-style"{text-align:center}":cell-style"{text-align:center}"><el-table-column label"选项字段"align"center&…...

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...