java核心-泛型

目录

  • 概述
  • 什么是泛型
  • 分类
    • 泛型类
    • 泛型接口
    • 泛型方法
  • 泛型通配符
    • 分类
  • 泛型类型擦除
    • 分类
      • 无限制类型擦除
      • 有限制类型擦除
  • 问题
    • 需求
    • 第一种
    • 第二种

概述

   了解泛型有利于学习 jdk 、中间件的源码,提升代码抽象能力,封装通用性更强的组件。

什么是泛型

  • 在定义类、接口和方法时,可以在声明时通过一定的格式指定其参数类型
  • 使用时再指定具体的类型,从而使用类、接口和方法可以被多种类型的数据所实例化和调用
  • 这种可以在编译时进行参数类型检查的技术被称为泛型,是 jdk 5 中引用的一个新特性
  • 本质是 参数化类型,给类型指定一个参数,在使用时再指定参数具体的值,那这个 类型可以在使用时决定
  • 优点
    • 将运行时的错误,提前到编译时,这样可以在编译时将错误提示出来,避免了运行时出现错误
    • 使用泛型可以提高代码的复用性,因为它可以支持多种类型的数据
    • 减少了源代码中的强制类型转换、代码更加可读

分类

  • 可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法
  • 泛型字母通常类型参数都使用大写的单个字母
    • T:任意类型 type
    • E:集合中元素的类型 element
    • K:key-value 形式 key
    • V:key-value 形式 value

泛型类

  • 泛型类
    • 泛型类型必须是引用类型,即类类型 (不能使用基本数据类型)
    • 在类名后添加一对尖括号,并在尖括号中填写类型参数
    • 如果参数可以有多个,多个参数使用逗号分隔
public class 类名<泛型1,...>{private 泛型类型 变量名public 泛型类型 方法名(){};public 返回值 方法名(泛型类型 t) {}
}

注意

  • 泛型类创建的使用没有指定类型,则默认是object类型
  • 泛型类型从逻辑上看是多个类型,实际都是相同类型
  • java 可以创建对应的泛型对象和泛型数组引用,但不能直接创建泛型对象和泛型数组
    • java有类型擦除,任何泛型类型在擦除之后就变成了 Object 类型
    • 因此创建泛型对象就相当于创建了一个 Object 类型的对象
    • 所以直接创建泛型对象和泛型数组的行为被编译器禁止

泛型接口

注意

  • 泛型知识点
    • 如果泛型类的子类也是泛型类,那父类和子类的类型要一致
    • 如果子类泛型有多个,那需要包括父类的泛型类型
class Child <T,E,E> extends Parent<T> {
}泛型接口 接口名称 <泛型类型1,...>{
}

泛型方法

泛型方法

  • 调用方法的时候指定泛型的具体类型
  • 格式如下
    修饰符 <T,E,...> 返回值类型 方法名(){
    }
    
  • 修饰符和返回值中间有 <T,E,...> 才是泛型方法 泛型类里的普通返回值类型不是泛型方法
    在这里插入图片描述
  • 注意
    • 泛型类的类型和泛型方法的类型是互相独立的,同名也不影响
    • 声明了 泛型方法 在参数列表和方法体里面才可以用对应的泛型
      在这里插入图片描述
  • 使用了类泛型的成员方法,不能定义为静态方法;使用了泛型方法的才可以定义为静态方法
    在这里插入图片描述
  • 可变参数的泛型方法
    在这里插入图片描述

泛型通配符

  • java 泛型的通配符是用于解决泛型之间引用传递问题的特殊语法
// 表示类型参数可以是任何类型
public class CustomCollection<?>{}// 表示类型参数必须是A或者是A的子类
public class CustomCollection<T extends A>{}// 表示类型参数必须是A或者是A的超类型
public class CustomCollection<T supers A>{}

分类

  • 通用类型通配符 <?> 如 List<?>
    • 主要作用就是让泛型能够接受未知类型的数据
    • 可以将 ? 看成所有泛型类型的父类,是一种真实的类型,类型通配符是实参,不是形参
  • 固定上边界的通配符采用 <? extends E> 的形式
    • 使用固定上边界的通配符的泛型,只能够接受指定类型及其子类类型的数据
    • 采用<? extends E> 的形式,这里的E就是该泛型的上边界
    • 注意:虽然使用 extends 关键字,却不仅限于继承了父类E的子类 ,也可以代指实现了接口的 E 的类
  • 固定下边界的通配符,采用 <? super E> 的形式
    • 使用固定下边界的通配符的泛型,只能够接受指定类及其父类类型的数据
    • 采用<? super E> 的形式,这里的 E 就是该泛型的下边界
    • 可以为一个泛型指定上边界或下边界,但是不能同时指定上下边界

泛型类型擦除

   泛型是 jdk 1.5 后出现的,但泛型代码和常规版本代码可以兼容,主要原因是泛型信息是在代码编译阶段,代码编译完成后进入 jvm 运行前,相关的泛型类型信息会被删除,这个即 泛型类型擦除
   作用范围:类泛型、接口泛型、方法 泛型

分类

无限制类型擦除

擦除后都是 Object,没指定类型则擦除后是 Object 最顶级父类
在这里插入图片描述

有限制类型擦除

在这里插入图片描述

问题

如何解决创建 泛型数组和获取全部数组

需求

创建一个类里面支持泛型数组和返回全部数组的方法

第一种

  可以通过返回下的 Array.newInstance 创建泛型数组,自动生成指定的类型字节码即可,使用可以创建实际类型的数组

在这里插入图片描述

第二种

jdk源码 ArrayList中的实现

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode设置好看清晰的字体!中文用鸿蒙,英文用Jetbrains Mono

一、中文字体——HarmonyOS Sans SC 1、下载字体 官网地址&#xff1a;https://developer.huawei.com/consumer/cn/design/resource/ 直接下载&#xff1a;https://communityfile-drcn.op.dbankcloud.cn/FileServer/getFile/cmtyPub/011/111/111/0000000000011111111.20230517…

加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽

在当前高度智能化的社会背景下&#xff0c;智能手机早已成为人们生活、工作的必备品&#xff0c;智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节&#xff0c;包括钻孔和铣槽等。钻孔要求精度高、孔位准确&#xff0c;而铣槽则需要保证槽位规整、深度适宜。这些…

【漏洞复现】TerraMaster TOS exportUser.php 远程命令执行

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

Leetcode3195. 包含所有 1 的最小矩形面积 I

Every day a Leetcode 题目来源&#xff1a;3195. 包含所有 1 的最小矩形面积 I 解法1&#xff1a;遍历 设最左、最右、最上、最下的 1 的行号/列号分别为 left、right、top、bottom&#xff0c;则答案为&#xff1a;(right - left 1) * (bottom - top 1)。 代码&#xf…

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

基于java+springboot+vue实现的仓库管理系统(文末源码+lw+ppt)23-499

第1章 绪论 伴随着信息社会的飞速发展&#xff0c;仓库管理所面临的问题也一个接一个的出现&#xff0c;所以现在最该解决的问题就是信息的实时查询和访问需求的问题&#xff0c;以及如何利用快捷便利的方式让访问者在广大信息系统中进行查询、分享、储存和管理。这对我们的现…

WordPress:快速搭建站点,wp安装及模版介绍

最近搭建个人站点比较多&#xff0c;都是想把业务做到国外&#xff0c;通过google来引流&#xff0c;那我们今年就来介绍一个比较受欢迎的站点平台wordPress。WordPress是使用PHP语言开发的博客平台&#xff0c;用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也…

JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链,由浅入深详细讲解!

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享JavaScript 中的面向对象编程--->构造函数--->原型对象与原型链&#xff0c;由浅入深详细讲解&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&am…

【算法训练记录——Day42】

Day42——动态规划Ⅳ 1.leetcode_1049最后一块石头的重量II2.leetcode_494目标和3.leetcode_474一和零 1.leetcode_1049最后一块石头的重量II 思路&#xff1a;石头只能用一次。。。怎么才能让碰撞后重量最小呢&#xff0c;还要转换成动态规划&#xff0c;难以理解。。 看题解&…

基于轨迹信息的图像近距离可行驶区域方案验证

一 图像可行驶区域方案 1.1 标定场景 1.2 标定步骤 设计一定间距标定场&#xff0c;在标定场固定位置设置摄像头标定标识点。主车开到标定场固定位置录制主车在该位置各个摄像头数据&#xff0c;通过摄像头捕获图像获取图像上关键点坐标pts-2d基于标定场设计&#xff0c;计算…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…

Python28-9 XGBoost算法

XGBoost&#xff08;eXtreme Gradient Boosting&#xff0c;其正确拼写应该是 "Extreme Gradient Boosting"&#xff0c;而XGBoost 的作者在命名时故意使用了不规范的拼写&#xff0c;将“eXtreme”中的“X”大写&#xff0c;以突出其极限性能和效率&#xff09;是一…

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式&#xff08;Prompt-tuning&#xff0c;Prefix-tuning&#xff0c;P-tuning&#xff09; &#xff0c;主要是围绕NLP上的成果&#xff0c;具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

普中51单片机:数码管显示原理与实现详解(四)

文章目录 引言数码管的结构数码管的工作原理静态数码管电路图开发板IO连接图代码演示 动态数码管实现步骤数码管驱动方式电路图开发板IO连接图真值表代码演示1代码演示2代码演示3 引言 数码管&#xff08;Seven-Segment Display&#xff09;是一种常见的显示设备&#xff0c;广…

C-11 三角剖分的调研

C-11 三角剖分算法 三角剖分就是将输入的多边形&#xff0c;分割成一系列互不重叠的三角形&#xff0c;其重要性就在这不多赘述。这个是一个别人总结的链接&#xff1a;http://vterrain.org/Implementation/Libs/triangulate.html 图片链接&#xff1a;http://www-cgrl.cs.m…

【笔记】在window上连接虚拟机中的redis

愚昧啊 困扰了我近两天的问题居然是因为是java代码写错地方了 在虚拟机中进入redis.conf文件 vim redis.conf /bind --斜杠搜索关键词 将值设置为 bind 0.0.0.0 保存 退出:wq 回到java中 添加redis依赖 刷新maven 就是在这一步出问题……………………………………自己在蓝…

新型水冷电阻设计-双面水冷电阻器

一款革命性的电阻器&#xff0c;专为低压和中压应用而设计&#xff0c;尤其是汽车、牵引或船舶系统中的恶劣条件。 EAK采用先进材料制造&#xff0c;采用专利设计&#xff0c;将电阻元件与水基冷却液封装并完全分离&#xff0c;为水冷应用提供模块化、轻量级、小容量、高功率解…

PYTHON自学笔记(一)vscode配置

安装python 自行官网下载 安装vscode 自行官网下载 环境变量设置 把python和scripts的文件路径&#xff0c;添加到环境变量的path中&#xff0c;如图&#xff1a; 此项不弄&#xff0c;在命令行模式中系统不会认为你装了python和pip&#xff0c;你的输入相关命令shell不会…

【Elasticsearch】Elasticsearch倒排索引详解

文章目录 &#x1f4d1;引言一、倒排索引简介二、倒排索引的基本结构三、Elasticsearch中的倒排索引3.1 索引和文档3.2 创建倒排索引3.3 倒排索引的存储结构3.4 词典和倒排列表的优化 四、倒排索引的查询过程4.1 过程4.2 示例 五、倒排索引的优缺点5.1 优点5.2 缺点 六、倒排索…

ComfyUI+MuseV+MuseTalk图片数字人

电脑配置 GPU12G&#xff0c;如果自己电脑配置不够&#xff0c;选择云gpu&#xff0c;我就是用的这个&#xff0c;自己电脑太老配置跟不上 环境&#xff1a; Python 3.11.8 torch 2.2.1 cuda_12.1 资源提供&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1_idZbF…