Java 泛型基础

目录

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.mzph.cn/web/16146.shtml

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

相关文章

基于深度学习的入侵检测系统综述文献概述

好长时间不发博客了&#xff0c;不是因为我摆烂了&#xff0c;是我换研究方向了&#xff0c;以后我就要搞科研了。使用博客记录我的科研故事&#xff0c;邀诸君共同见证我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互联网发展迅速&#xff…

基于ssm的蛋糕商城系统java项目jsp项目javaweb

文章目录 蛋糕商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 蛋糕商城系统 一、项目演示 蛋糕商城管理系统 二、项目介绍 系统角色 : 管理员、用户 一&#xff0c;管理员 管理员有…

Mixed-precision计算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】选择排序以及需要注意的问题

选择排序的基本思想&#xff1a;每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 第一种实现方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金丝雀发布后续 + 声明式资源管理yaml

目录 一、K8S常见的发布方式 1.1蓝绿发布 1.2灰度发布&#xff08;金丝雀发布&#xff09; 1.3滚动发布 二、金丝雀发布 三、声明式管理方法 3.1YAML 语法格式 3.1.1查看 api 资源版本标签 3.1.2查看资源简写 3.2YAML文件详解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

C++系列-C/C++内存管理方式

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C/C内存分布 在这篇文章开始之前&#xff0c;我们先以一道题目来进行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

在CSDN上成长的感悟,你的粉丝长啥样?

文章目录 一、写作的初衷1. 记录所学内容2.巩固所学知识3.分享与帮助4.方便后续查找5.获取激励 二、你的粉丝长啥样&#xff1f;1. 粉丝的特点与困惑2. 关于粉丝&#xff0c;细思极恐 三、继续前行、坚持初心 在CSDN上写博文&#xff0c;对于我来说&#xff0c;不仅仅是一个记录…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用继承&#xff1a;2、案例2&#xff1a;final修饰的类不可以被继承&#xff1a;3、案例3&#xff1a;final修饰的类不能有子类&#xff0c;但是可以有父类4、final修饰构造方法5、final修饰普通方法6、…

渗透工具CobaltStrike工具的下载和安装

一、CobalStrike简介 Cobalt Strike(简称为CS)是一款基于java的渗透测试工具&#xff0c;专业的团队作战的渗透测试工具。CS使用了C/S架构&#xff0c;它分为客户端(Client)和服务端(Server)&#xff0c;服务端只要一个&#xff0c;客户端可有多个&#xff0c;多人连接服务端后…

音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM

1.SDL简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;&#xff0c;是一个跨平台的C语言多媒体开发库。 支持Windows、Mac OS X、Linux、iOS、Android 提供对音频、键盘、鼠标、游戏操纵杆、图形硬件的底层访问 很多的视频播放软件、模拟器、受欢迎的游戏都在使用…

面试中算法(A星寻路算法)

一、问题需求&#xff1a; 迷宫寻路游戏中&#xff0c;有一些小怪物要攻击主角&#xff0c;现在希望你给这些小怪物加上聪 明的AI (Artificial Intelligence&#xff0c;人工智能&#xff09;&#xff0c;让它们可以自动绕过迷宫中的障碍物&#xff0c;寻找到主角的所在。 A星…

json web token及JWT学习与探索

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 作用&#xff1a; 主要是做鉴权用的登录之后存储用户信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

1107 老鼠爱大米

solution 记录每组的最大值&#xff0c;并比较组间的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介绍与基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【论文复现】LSTM长短记忆网络

LSTM 前言网络架构总线遗忘门记忆门记忆细胞输出门 模型定义单个LSTM神经元的定义LSTM层内结构的定义 模型训练模型评估代码细节LSTM层单元的首尾的处理配置Tensorflow的GPU版本 前言 LSTM作为经典模型&#xff0c;可以用来做语言模型&#xff0c;实现类似于语言模型的功能&am…

【Torch学习笔记】

作者&#xff1a;zjk 和 的区别是逐元素相乘&#xff0c;是矩阵相乘 cat stack 的区别 cat stack 是用于沿新维度将多个张量堆叠在一起的函数。它要求所有输入张量具有相同的形状&#xff0c;并在指定的新维度上进行堆叠。

【NumPy】关于numpy.mean()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Android11热点启动和关闭

Android官方关于Wi-Fi Hotspot (Soft AP) 的文章&#xff1a;https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager类中有一套系统 API 可以控制热点的开和关&#xff0c;代码如下&#xff1a; 开启热点&#xff1a; // SoftApC…