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…

Android firebase消息推送集成 FCM消息处理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一个服务&#xff0c;用于处理来自 Firebase 服务器的消息。它有几个关键的方法&#xff0c;你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解释这些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它们用于不同的情况,取决于你是否通过指针访问结构体成员。

p->name&#xff1a;这是指针访问运算符&#xff08;箭头运算符&#xff09;。当 p 是一个指向结构体的指针时&#xff0c;用 p->name 来访问结构体的成员。 student* p &stu; // p 是一个指向 student 类型的指针 cout << p->name << endl; // 通过…

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

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

PICO VR眼镜定制播放器使用说明文档videoplayerlib-ToB.apk

安装高级定制播放器 高级定制播放器下载地址:https://download.csdn.net/download/ahphong/89360454 仅限用于PICO G2、G3、G4、NEO系列VR眼镜上使用, 用途:用于第三方APP(开发者)调用定制播放器播放2D、3D、180、360全景视频。 VR眼镜系统请升级到最新版,可在官网下载,…

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 …

CSS3特殊属性

特殊属性 will-change will-change 属性用于向浏览器提供提示,表明某个元素或其特定属性在未来极有可能发生变化。这有助于浏览器提前优化相关渲染流程,提升动画或其他动态效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

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…

异构图上的连接预测一

这里写目录标题 异构图&#xff1f;处理数据&#xff1a; 异构图&#xff1f; 异构图&#xff1a;就是指节点与边类型不同的图。 连接预测&#xff1a;目的是预测图中两个节点之间是否存在一条边&#xff0c;或者是预测两个节点之间&#xff0c;在未来可能形成的连接。 eg&…

Linux系统如何通过编译方式安装python3.11.3

1.切换到/data 目录 cd /data 2.下载python源码Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安装路径 和 执行openssl的路径 ./configure --prefix/usr/local/pyth…

Java筑基(三)

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

头歌GCC编程工具集第1关:实验工具GCC与objdump的使用

任务要求 根据提示&#xff0c;在右侧编辑器中显示的bytes.c文件中的 Begin-End 之间补充代码&#xff08;即设置一个数组的初始值&#xff09;&#xff0c;使其与如下显示的main.c文件一起编译、生成的程序在运行时输出“SUCCESS”。 程序源文件main.c的内容如下&#xff08;务…

牛客前端面试高频八股总结(1)(附文档)

1.html语义化 要求使用具有语义的标签&#xff1a;header footer article aside section nav 三点好处&#xff1a; &#xff08;1&#xff09;提高代码可读性&#xff0c;页面内容结构化&#xff0c;更清晰 &#xff08;2&#xff09;无css时&#xff0c;时页面呈现出良好…

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

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

Golang设计模式(四):观察者模式

观察者模式 什么是观察者 观察者模式(Observer Pattern)&#xff1a;定义对象之间的一种一对多依赖关系&#xff0c;使得每当一个对象状态发生改变时&#xff0c;其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅&#xff08;Publish/Subscribe&#xf…