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.mzph.cn/diannao/42749.shtml

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

相关文章

二手闲置平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;商品购买管理&#xff0c;商品配送管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&a…

【linux服务器】大语言模型实战教程:LLMS大模型部署到个人服务器或嵌入式开发板(保姆级教学)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

基于Java+SpringMvc+Vue技术智慧校园系统设计与实现--60页及以上论文参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

网络基础:园区网络架构

园区网络 园区网络&#xff08;Campus Network&#xff09;是指在一个相对较大的区域内&#xff0c;如大学校园、企业园区或政府机关等&#xff0c;建立的计算机网络系统。园区网络根据规模的不同&#xff0c;可以分为以下几种类型&#xff1a; ①小型园区网络&#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…

vb.netcad二开自学笔记6:第一个绘制线段命令

.net编写绘制直线已完全不同于ActiveX的&#xff08;VBA&#xff09;的方式&#xff0c;过程更类似于arx程序&#xff0c;需要通过操作AutoCAD 数据库添加对象&#xff01;下面的代码是在以前代码基础上添加了一个新myline命令。 AutoCAD 数据库结构 myline命令代码 Imports A…

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

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

使用ndoe实现自动化完成增删改查接口

使用ndoe实现自动化完成增删改查接口 最近工作内容比较繁琐&#xff0c;手里需要开发的项目需求比较多&#xff0c;常常在多个项目之间来回切换&#xff0c;有时候某些分支都不知道自己开发了什么、做了哪些需求&#xff0c; 使用手写笔记的方式去记录分支到头来也是眼花缭乱&a…

vscode调试教程

VSCode调试 VSCode Debuggers VSCode使用launch.json进行细粒度的控制&#xff0c;可以启动程序或将其附加到复杂的调试场景中 打开Run and Debug视图Ctrl Shift D 点击create a launch.json file&#xff0c;选择C(GDB/LLDB) 会在工作目录自动创建.vscode/launch.json文…

【Python】已解决:(MongoDB安装报错)‘mongo’ 不是内部或外部命令,也不是可运行的程序

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决&#xff1a;&#xff08;MongoDB安装报错&#xff09;‘mongo’ 不是内部或外部命令,也不是可运行的程序 一、分析问题背景 在安装和配置MongoDB时&#xff0c;有…

怎样在 PostgreSQL 中优化对 UUID 数据类型的索引和查询?

文章目录 一、UUID 数据类型概述二、UUID 索引和查询的性能问题三、优化方案&#xff08;一&#xff09;选择合适的索引类型&#xff08;二&#xff09;压缩 UUID&#xff08;三&#xff09;拆分 UUID&#xff08;四&#xff09;使用覆盖索引&#xff08;五&#xff09;优化查询…

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

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

Pyserial设置缓冲区大小失败

文章目录 问题描述原因分析解决方案 问题描述 使用set_buffer_size()设置缓冲区大小后&#xff0c;buffer size仍为默认的4096 import time import serial ser serial.Serial(baudrate9600, timeout0.5) ser.port COM1 ser.set_buffer_size(rx_size8192) ser.open() while …

windows上部署python3.11

hello&#xff0c;大家好&#xff0c;我是一名测试开发工程师&#xff0c;至今已在自动化测试领域深耕9个年头&#xff0c;现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦&#xff0c;在接下来的一个月里&#xff0c;我将免费指导大家使用wyTest&#xff0c;请大家…

欧拉函数.

性质1&#xff1a;质数n的欧拉函数为n-1. 性质2&#xff1a;如果p&#xff0c;q都是质数&#xff0c;那么ϕ ( p ∗ q ) ϕ ( p ) ∗ ϕ ( q ) ( p − 1 ) ∗ ( q − 1 ) 证明&#xff1a;p&#xff0c;2p....q*p都不与q*p互质&#xff0c;q同理&#xff0c;所以总的不互质个…

STM32芯片系列与产品后缀解读

一. 产品系列 STM32单片机是一系列基于ARM Cortex-M内核的32位微控制器&#xff0c;广泛应用于嵌入式系统中。 STM32系列由STMicroelectronics&#xff08;意法半导体&#xff09;开发和生产&#xff0c;并凭借其灵活的设计、丰富的外设和强大的生态系统&#xff0c;成为嵌入式…

咬文嚼字:词元是当今生成式人工智能失败的一个重要原因

生成式人工智能模型处理文本的方式与人类不同。了解它们基于"标记"的内部环境可能有助于解释它们的一些奇怪行为和顽固的局限性。从 Gemma 这样的小型设备上模型到 OpenAI 业界领先的 GPT-4o 模型&#xff0c;大多数模型都建立在一种称为转换器的架构上。由于转换器在…

Ubuntu24.04清理常见跟踪软件tracker

尽量一天一更&#xff0c;不刷视频&#xff0c;好好生活 打开系统监视器&#xff0c;发现开机有个tracker-miner-fs-fs3的跟踪程序&#xff0c;而且上传了10kb的数据。 搜索知&#xff0c;该程序会搜集应用和文件的信息。 删除tracker 显示带tracker的apt程序 sudo apt lis…

书生·浦语2.5开源,推理能力再创新标杆

导读 2024 年 7 月 3 日&#xff0c;上海人工智能实验室与商汤科技联合香港中文大学和复旦大学正式发布新一代大语言模型书⽣浦语2.5&#xff08;InternLM2.5&#xff09;。相比上一代模型&#xff0c;InternLM2.5 有三项突出亮点&#xff1a; 推理能力大幅提升&#xff0c;在…

Python | Leetcode Python题解之第222题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def countNodes(self,…