Java 泛型基础

news2025/4/6 1:32:13

目录

1. 为什么使用泛型

2. 泛型的使用方式

2.1. 泛型类 

2.2. 泛型接口

 2.3. 泛型方法

3. 泛型涉及的符号

3.1. 类型通配符"?" 

3.2. 占位符 T/K/V/E

 3.3. 占位符T和通配符?的区别。

 4. 泛型不变性

 5. 泛型编译时擦除


1. 为什么使用泛型

Java 为什么使用泛型-CSDN博客

2. 泛型的使用方式

2.1. 泛型类 

 泛型类是用类型参数定义类的一种方式。这些类型参数在声明类变量或作为方法参数时会被具体的类型所替代。

public class Box<T> {  
    private T t;  
  
    public void set(T t) { this.t = t; }  
    public T get() { return t; }  
}

2.2. 泛型接口

泛型接口和泛型类的定义方式类似。

public interface List<E> extends Collection<E> {  
    // ...  
}

 2.3. 泛型方法

泛型方法是在方法定义中声明类型参数的方法。

public static <T> T getFirst(List<T> list) {  
    if (list == null || list.isEmpty()) {  
        return null;  
    }  
    return list.get(0);  
}

3. 泛型涉及的符号

3.1. 类型通配符"?" 

如 ?、? extends T、? super T。用于表示未知的类型,或表示某个类型的子类型或超类型。

  • 无界通配符“?“:

无界通配符表示未知的类型。当使用无界通配符时,编写时不能往这个通配符表示的集合中存放元素,但是可以从集合中获取元素(并且只能赋值给 Object 类型的变量或是进行类型转换)。这是因为编译器不知道集合中元素的具体类型,所以不能确保放入的元素与集合中已有的元素类型兼容。


运行时可以赋值对象。

Class<?> clazz = Class.forName("com.mycompany.myreflect.Student");

  • ? extends T:

表示未知的类型,但它是 T 或 T 的某个子类型。
我们就叫做上界限通配符,upper bounded wildcard。
当你需要读取集合中的元素,并且你知道元素的类型至少是 T 时,可以使用这种通配符。但是,你不能往这个集合中添加元素(除了 null),因为编译器无法确保你要添加的元素与集合中已有的元素类型兼容。

  • ? super T:

表示未知的类型,但它是 T 或 T 的某个超类型。
 我们就叫做下界通配符, ​​​lower bounded wildcard。
当你需要向集合中添加元素,并且你知道这些元素的类型是 T 或其子类时,可以使用这种通配符。同时,你也可以从集合中读取元素,但是只能赋值给 Object 类型的变量或是 T 的超类型。

3.2. 占位符 T/K/V/E

T是占位符。其实它同K/V/E是一样的没有任何差别。只是我们的习惯会将它用在不同地方用于区别。

public class PrinterGen<T> { 
//这个字符T,其实你可以使用你喜欢的字符代替,但是它必须和尖括号配合使用
//...
}

 3.3. 占位符T和通配符?的区别。

  • 用途:泛型主要用于定义可重用的类、接口和方法,其中类型参数在编译时确定。通配符主要用于表示对类型的约束或限制,通常用于泛型方法或泛型类的参数
  • 类型擦除:泛型在编译时会被类型擦除,而通配符在运行时仍然存在,用于表示对类型的约束。
  • 编译时是否确定:如果编译时可以确定类型的,就可以使用T。而一定要等到运行时才能确定具体类型的就需要使用?
            Class<?> clazz = Class.forName("com.mycompany.myreflect.Student");
            System.out.println(clazz);
    
            Class<Student> clazz = Student.class;
            System.out.println(clazz);
    而申明方法,类型,接口时,只能使用T,不能使用?。也是由于我们申明的方法等,在编译时调用它的地方参数可以是不同的,但是必须是确定的。

 4. 泛型不变性

Java中的泛型不变性(Generics Invariance)主要指的是泛型类型在编译时的类型安全性质,它确保了泛型类型在声明和使用时类型的一致性。 

 

这是因为虽然String是Object的子类,但是List<String>并不是List<Object>的子类。

 5. 泛型编译时擦除

Java的泛型类型信息是在编译时被擦除的,而不是在运行时。这是Java泛型实现的一个重要特性,称为类型擦除(Type Erasure)。

在编译时,Java编译器会处理泛型代码,生成不包含泛型类型信息的字节码。具体来说,编译器会将泛型类型参数替换为它们的上界(通常是Object,除非明确指定了其他上界),并插入必要的类型转换和类型检查代码以确保类型安全。这个过程被称为类型擦除。

在运行时,Java虚拟机(JVM)加载并运行这些已经过类型擦除的字节码。由于泛型类型信息已经被擦除,JVM不知道也不关心这些类型参数。它只看到普通的类和接口,以及普通的方法调用和字段访问。

因此,虽然泛型提供了类型安全和更好的代码可读性,但它们并不会影响Java程序的运行时行为。泛型主要是一种编译时的语法糖,用于提高代码的可读性和类型安全性,而不会增加任何运行时开销。

源代码

编译后

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

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

相关文章

Django 里的静态资源调用

静态资源&#xff1a;图片&#xff0c;CSS, JavaScript 一共有两种方法 第一种方法 在项目的文件夹里创建名为 static 文件夹 在该文件夹里&#xff0c;添加静态资源 在 settings.py 里添加路径 import os# Static files (CSS, JavaScript, Images) # https://docs.djan…

Git基础命令:带图整理

基础命令 Git 安装 Git下载地址 https://git-scm.com/downloads Git安装&#xff08;Window/Mac&#xff09; 选择不同系统安装包安装 检验是否安装成功 出现Git Bash命令行工具或Git GUI工具git --version 查看git安装版本 Git 结构 工作区&#xff08;Working Direct…

干货收藏 | 掌握ChatGPT提示词的精髓:从小白到高手!!

前言 提示决定了 ChatGPT 的输出。也就是说&#xff1a;GPT 生成的答案质量&#xff0c;完全取决于你“问它”&#xff0c;以及“引导它”的方式&#xff0c;如果你能问得好&#xff0c;引导的好&#xff0c;那么它就会帮你生成让你惊喜的答案&#xff0c;反之则无价值&#x…

国际版Tiktok抖音运营流量实战班:账号定位/作品发布/热门推送/等等-13节

课程目录 1-tiktok账号定位 1.mp4 2-tiktok作品发布技巧 1.mp4 3-tiktok数据功能如何开通 1.mp4 4-tiktok热门视频推送机制 1.mp4 5-如何发现热门视频 1.mp4 6-如何发现热门音乐 1.mp4 7-如何寻找热门标签 1.mp4 8-如何寻找垂直热门视频 1.mp4 9-如何发现热门挑战赛 1…

从垃圾识别到收集器:详细聊聊Java的GC

个人博客 从垃圾识别到收集器:详细聊聊Java的GC | iwts’s blog 前言 聊GC&#xff0c;自然离不开JVM内存模型&#xff0c;建议先了解JVM内存模型相关内容&#xff0c;或者最起码了解堆相关的内容&#xff0c;GC主要处理的就是堆。 这里会从垃圾识别算法->GC算法->JV…

OWASP top10--SQL注入(二)

目录 06&#xff1a;SQL注入提交方式 6.1、get提交 6.2、post提交 6.3、cookie提交 6.4、HTTP Header头提交 07&#xff1a;注入攻击支持类型 7.1、union注入&#xff1a; 7.1.1、union操作符一般与order by语句配合使用 7.1.2、information_schema注入 7.2、基于函数…

【云原生--K8S】K8S python接口研究

文章目录 前言一、搭建ubuntu运行环境1.运行ubuntu容器2.拷贝kubeconfig文件二、python程序获取k8s信息1.获取node信息2.获取svc信息3.常用kubernetes API总结前言 在前面的文章中我们都是通过kubectl命令行来访问操作K8S,但是在实际应用中可能需要提供更方便操作的图形化界面…

数据结构和算法|排序算法系列(二)|冒泡排序

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.3 冒泡排序 我觉得冒泡排序非常有意思&#xff0c;也非常简单&#xff0c;就是不停地交换相邻的元素即可&#…

c语言IO

前言 老是忘记c语言IO操作&#xff0c;故写个文章记录一下 打开文件 fopen FILE *fopen(const char *path, const char *mode);mode 返回值 如果文件成功打开&#xff0c;fopen 返回一个指向 FILE 结构的指针。如果文件打开失败&#xff08;例如&#xff0c;因为文件不存…

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询&#xff1a; 9. 聚合函数 5. top top查询&#xff1a;查询表的前几行&#xff1b;下面是代码演示&#xff1a; --top&#xff08;前面的几个记录&#xff09; select top 2 * from emp; --查询表的前两列 select top 20 percent *…

解密论文评审过程:SCI论文是匿名送审的吗?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 前几天有位学员问我&#xff0c;审稿人能看见我论文的作者和单位信息吗&#xff1f;应该是双方都匿名才更公平啊。 同行评议&#xff0c;在不同的期刊操作还真不一样。有双方…

python数据分析——数据可视化(图形绘制)

数据可视化&#xff08;图形绘制基础&#xff09; 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制scatter()示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线…

代码随想录|Day55|动态规划 part15|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 class Solution: def isSubsequence(self, s: str, t: str) -> bool: dp [[0] * (len(t) 1) for _ in range(len(s) 1)] for i in range(1, len(s) 1): for j in range(1, len(t) 1): if s[i - 1] t[j - 1]: dp[i][j] dp[i - 1][j - 1] 1 else: dp[i…

3、xss-labs之lecel3

1、测试 开始页面&#xff0c;传入<script>alert(1)</script>&#xff0c;不出意外没有弹窗 2、按住CTRLU&#xff0c;查看返回的前端代码 3、看后端源码 htmlspecialchars() 是一个 PHP 函数&#xff0c;用于将特殊字符转换为 HTML 实体。比如 & &#xff08…

访问元组元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;如果想将元组的内容输出也比较简单&#xff0c;可以直接使用print()函数即可。例如&#xff0c;要想打印上面元组中的untitle…

Java核心:注解处理器

Java提供了一个javac -processor命令支持处理标注有特定注解的类&#xff0c;来生成新的源文件&#xff0c;并对新生成的源文件重复执行。执行的命令大概是这样的: javac -XprintRounds -processor com.keyniu.anno.processor.ToStringProcessor com.keyniu.anno.processor.Po…

LeetCode热题100—链表(一)

160.相交链表 题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#x…

头歌结构化分析方法-数据流图

第1关&#xff1a;数据流图-画出外部实体 第2关&#xff1a;数据流图-画出加工 第3关&#xff1a;数据流图-画出数据存储 第4关&#xff1a;数据流图-画出数据流 第5关&#xff1a;数据流图-机票预定系统

奥维互动地图奥维彩色图源

彩色图源(不足&#xff0c;更精细放大) 等位线3D模式 中科星 谷歌2024(不足没以前高清)

神经网络与深度学习-简要入门

参考引用 神经网络与深度学习 1. 绪论 从根源来讲&#xff0c;深度学习是机器学习的一个分支&#xff0c;是指一类问题以及解决这类问题的方法 深度学习问题是一个机器学习问题&#xff0c;指从有限样例中通过算法总结出一般性的规律&#xff0c;并可以应用到新的未知数据上深…