java核心-泛型

news2024/12/24 0:19:48

目录

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

概述

   了解泛型有利于学习 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.coloradmin.cn/o/1906010.html

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

相关文章

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名&#xff1a; 1.1什么是域名&#xff1f; 网域名称(英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain)&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

YoloV9改进策略:Block改进|轻量实时的重参数结构|最新改进|即插即用(全网首发)

摘要 本文使用重参数的Block替换YoloV9中的RepNBottleneck&#xff0c;GFLOPs从239降到了227&#xff1b;同时&#xff0c;map50从0.989涨到了0.99&#xff08;重参数后的结果&#xff09;。 改进方法简单&#xff0c;只做简单的替换就行&#xff0c;即插即用&#xff0c;非常…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

Cyber Weekly #14:WAIC 2024

赛博新闻 1、WAIC2024开幕&#xff1a;一半机器人&#xff0c;一半大模型 7月4日&#xff0c;AI界春晚——2024世界人工智能大会&#xff08;WAIC 2024&#xff09;在上海开幕&#xff0c;大会展示了500家企业的1500项展品&#xff0c;突出了机器人和大模型技术。国产机器人和…

【Excel】 给证件照换底色

1. 双击图片 → 删除背景 2. 标记要保留的区域 → 标记 → 保留更改 3. 重新设置背景色

知识的向量表示

1、one-hot表示&#xff0c;空间太大 2、bag词袋模型&#xff0c;无法表示词的语义 3、词的语义由什么决定&#xff1f;词由他的上下文决定&#xff1f;分布式语义 4、CBow&#xff0c;通过前面几个词和后面几个词&#xff0c;预测中间几个词 5、skip-gram&#xff0c;通过…

深度讲解 UUID/GUID 的结构、原理以及生成机制

目录 一. 前言 二. 被广泛使用 三. UUID 的结构 3.1. 必须了解的 3.2. 十六进制数字字符&#xff08;hexDigit&#xff09; 3.3. UUID 基本结构 3.4. 类型&#xff08;变体&#xff09;和保留位 3.5. 版本&#xff08;子类型&#xff09; 3.6. 时间戳 3.7. 时钟序列 …

MySQL之备份与恢复和MySQL用户工具(一)

备份与恢复 备份脚本化 为备份写一些脚本是标准做法。展示一个示例程序&#xff0c;其中必定有很多辅助内容&#xff0c;这只会增加篇幅&#xff0c;在这里我们更愿意列举一些典型的备份脚本功能&#xff0c;展示一些Perl脚本的代码片段。你可以把这些当作可重用的代码块&…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

计算机如何存储浮点数

浮点数组成 在计算机中浮点数通常由三部分组成&#xff1a;符号位、指数位、尾数位。IEEE-754中32位浮点数如下&#xff1a; 上图32bit浮点数包含1bit的符号位&#xff0c;8比特的指数位和23bit的尾数位。对于一个常规浮点数&#xff0c;我们来看看它是如何存储和计算的。这里…

保健品商城小程序模板源码

保健品商城小程序模板源码 简洁通用的保健品&#xff0c;健康生活&#xff0c;零售商品&#xff0c;电子商务微信小程序前端模板下载。包含&#xff1a;主页、购物车、客服、个人中心、我的订单、商品详情、我的钱包、设置等等。 保健品商城小程序模板源码

【系统架构设计师】八、系统工程基础知识(系统工程|系统性能)

目录 一、系统工程 1.1 系统工程的方法 1.1.1 霍尔的三维结构 1.1.2 切克兰德方法 1.1.3 并行工程方法 1.1.4 综合集成法 1.1.5.WSR 系统方法。 二、系统工程生命周期 2.1 系统工程生命周期7阶段 2.2 生命周期方法 三、基于模型的系统工程(MBSE) 四、系统性能 4.1…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统&#xff0c;万界星空科技开源的MES系统。该系统基于Java开发&#xff0c;具有广泛的适用性和高度的可定制性&#xff0c;能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…

高薪程序员必修课-JVM创建对象时如何解决多线程内存抢占问题

前言 在JVM中&#xff0c;堆的内存分配过程涉及到线程安全性的保障&#xff0c;具体来说涉及到对象的内存分配时&#xff0c;并不是简单的抢占式分配&#xff0c;而是通过一些机制来保证线程安全和高效的内存管理。下面解释一下JVM是如何设计来保证线程安全的&#xff1a; 内存…

输入Rviz打不开,显示could not contact Ros master at[..],retrying

直接输入rviz会报错无法打开 解决方法&#xff1a; 先输入roscore&#xff0c;再用ctrlaltt打开新终端&#xff0c;在新终端输入rviz/rosrun rviz rviz即可

密码技术中分组模式解析

目录 1. 概述 2. ECB模式 2.1 概述 2.2 ECB模式的加密 2.3 ECB模式的解密 2.4 优点 2.5 缺点 3. CBC模式【推荐】 3.1 概述 3.2 CBC模式的加密 3.3 CBC模式的解密 3.4 优点 3.5 缺点 4. CFB模式 4.1 概述 4.2 CFB模式的加密 4.3 CFB模式的解密 4.4 优点 4.…

一二三应用开发平台应用开发示例(6)——代码生成、权限配置、运行效果查看

生成代码 完成配置工作&#xff0c;接下来就是见证奇迹的时刻~ 返回到实体列表&#xff0c;选中“文件夹”记录&#xff0c;点击“生成代码”按钮&#xff0c;提示成功后&#xff0c;在项目的output目录下输出了平台基于配置模板产生的各层代码&#xff0c;在原有后端的基础上…

【国产开源可视化引擎Meta2d.js】网格

画布背景网格 在线体验&#xff1a; 乐吾乐2D可视化 示例&#xff1a; // 设置默认缺省网格属性 meta2d.store.options.grid true; // 开启 meta2d.store.options.gridColor eeeeee; // 网格线条颜色 meta2d.store.options.gridSize 10; // 格子大小// 设置单个图纸的网格…

java ReadWriteLock接口

在 Java 中&#xff0c;ReadWriteLock 接口的实现类ReentrantReadWriteLock 类提供了一种允许多个线程同时读取某一资源但只允许一个线程写的锁定机制。这种机制可以提高并发性能&#xff0c;特别是在读操作远多于写操作的场景下。 特性&#xff1a; 可重入&#xff1b;不存…

管理《欧盟数字服务法》交易者要求

《数字服务法》合规性 根据《数字服务法》(DSA) 的要求&#xff0c;对于在欧盟地区 (EU) 通过 App Store 分发 App 的所有交易商&#xff0c;Apple 需要验证并显示其联系信息。请指明你是否将以交易商或非交易商的身份在欧盟地区分发任何内容。进一步了解你是否应为交易商。 …