详解 Java 泛型:核心概念与实用示例

详解 Java 泛型:核心概念与实用示例

Java 泛型(Generics)是Java SE 5引入的一项特性,旨在提高代码的可重用性和类型安全性。通过泛型,开发者可以编写一个通用的类、接口或方法,可以与多种类型一起工作,而不需要为每种类型创建不同的版本。

泛型的核心概念

泛型类(Generic Class)
泛型类是包含一个或多个类型参数的类。例如:

public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

这里,T 是类型参数,可以在创建 Box 对象时指定具体的类型:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);

泛型方法(Generic Method):

泛型方法是包含类型参数的方法。类型参数在方法的声明中被指定。例如:

public class GenericMethodExample {public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}public static void main(String[] args) {Integer[] intArray = {1, 2, 3, 4};String[] stringArray = {"A", "B", "C"};printArray(intArray);printArray(stringArray);}
}

泛型接口(Generic Interface):

泛型接口和泛型类类似。它们允许类型参数在接口中使用。例如:

public interface Pair<K, V> {K getKey();V getValue();
}public class OrderedPair<K, V> implements Pair<K, V> {private K key;private V value;public OrderedPair(K key, V value) {this.key = key;this.value = value;}public K getKey() { return key; }public V getValue() { return value; }
}

类型通配符(Wildcard):

泛型中的通配符用于表示未知类型。通配符有三种形式:

  • 无限制通配符(?):表示任何类型。
public void printList(List<?> list) {for (Object elem : list) {System.out.println(elem);}
}
  • 有上限的通配符(? extends Type):表示类型是 Type 或其子类。
public void processList(List<? extends Number> list) {for (Number num : list) {System.out.println(num);}
}
  • 有下限的通配符(? super Type):表示类型是 Type 或其父类。
public void addNumber(List<? super Integer> list) {list.add(new Integer(123));
}

类型擦除(Type Erasure):

泛型在编译时会进行类型擦除,这意味着泛型类型在运行时被移除,并替换为其限定类型(如果未指定,则为 Object)。这使得泛型可以与非泛型代码互操作。

public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

编译后:

public class Box {private Object content;public void setContent(Object content) {this.content = content;}public Object getContent() {return content;}
}

使用泛型的注意事项

不能创建泛型类型的实例

public class Box<T> {// T t = new T(); // 错误:不能直接创建泛型类型的实例
}

静态成员不能使用类型参数

public class Box<T> {// private static T content; // 错误:静态变量不能使用类型参数
}

泛型数组创建受限

public class Box<T> {// T[] array = new T[10]; // 错误:不能直接创建泛型数组
}

示例:使用泛型的栈

public class GenericStack<T> {private List<T> stack = new ArrayList<>();public void push(T element) {stack.add(element);}public T pop() {if (!stack.isEmpty()) {return stack.remove(stack.size() - 1);}return null;}public boolean isEmpty() {return stack.isEmpty();}public static void main(String[] args) {GenericStack<String> stringStack = new GenericStack<>();stringStack.push("Hello");stringStack.push("World");System.out.println(stringStack.pop()); // 输出:WorldGenericStack<Integer> intStack = new GenericStack<>();intStack.push(1);intStack.push(2);System.out.println(intStack.pop()); // 输出:2}
}

结论

Java 泛型提供了一种类型安全的方式来实现通用编程。它们不仅提高了代码的可读性和可维护性,还避免了类型转换的错误。在编写通用类、接口和方法时,泛型是一个强大的工具。

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

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

相关文章

汽车电子学习【车载网络CAN/LIN】

车载网络CAN/LIN知识总结 STM32F1开发板测试 STM32测试程序 /** CAN 通信报文内容设置*/ void CAN_SetMsg(void) { #if CAN_STDTxMessage.StdId 0x12;TxMessage.IDE CAN_ID_STD; #elseTxMessage.ExtId 0x1314; //使用的扩展IDTxMessage.IDE CAN_ID_EXT; //扩展模式 #…

C++进程间通信 消息队列

C进程间通信 消息队列 消息队列概述消息队列代码示例1. 创建和发送消息的程序&#xff08;sender.cpp&#xff09;2. 接收消息的程序&#xff08;receiver.cpp&#xff09; 代码解释运行步骤运行结果 消息队列概述 消息队列是一种进程间通信机制&#xff0c;允许一个或多个进程…

Django 做migrations时出错,解决方案

在做migrations的时候&#xff0c;偶尔会出现出错。 在已有数据的表中新增字段时&#xff0c;会弹出下面的信息 运行这个命令时 python manage.py makemigrationsTracking file by folder pattern: migrations It is impossible to add a non-nullable field ‘example’ to …

Linux---网络相关配置

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网&#xff0c;需要的配置网络信息包括IP&#xff0c;子网掩码&#xff0c;网关和DNS。 一.查看网络信息 查看IP信息可以通…

echarts高级应用

目录 一、显示相关 1.1、主题 1.1.1、内置主题 1.1.2、自定义主题 1.2、调色盘和颜色渐变 1.2.1、主题调色盘<全局调色盘<局部调色盘 1.2.2、线性渐变(linear)、径向渐变(radial) 1.3、直接样式和高亮样式 1.3.1、直接样式 1.3.2、高亮样式 1.4、图表自适应 …

Fine-tuning和模型训练的关系

概述 Fine-tuning和模型训练不是完全相同的概念&#xff0c;但它们之间有密切的关系&#xff0c;都是机器学习和深度学习过程中的重要步骤。 模型训练是一个更广泛的概念&#xff0c;指的是使用数据去调整模型的内部参数&#xff0c;以使得模型能够从输入数据中学习并做出预测…

软件架构设计属性之三:结构性属性浅析

文章目录 引言一、结构性属性的定义二、结构性属性的关键要素1. 组件化2. 模块化3. 层次化4. 接口定义5. 数据流6. 依赖管理 三、结构性属性的设计原则1. 高内聚低耦合2. 松耦合3. 清晰的接口4. 可维护性5. 可扩展性 四、结构性属性的实现策略1. 组件划分2. 模块化设计3. 接口设…

【AREngine BUG 解决方法】无法获取有效的相机图像尺寸

近期拿了一台 华为mate20 Pro的手机&#xff0c;在运行AR示例的过程中出现了黑屏。 问题排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 经排查&#xff0c;发现(ARCamera对象的相机内参) getImageDimensions()返回的图像尺寸的width和height都为0。 这…

Kong api网关实战教程

1. kong介绍 Kong是一款基于OpenResty(NginxLua模块)编写的高可用、易扩展的&#xff0c;由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgresQL构建的&#xff0c;能据供易于使用的RSTTAP[来操作和配置API管理系统&#xff0c;所以它可以水平扩…

【上】王树森《小红书推荐系统公开课》- 课程笔记(推荐系统基础、召回、排序)

写在前面 本文为王树森老师《小红书推荐系统公开课》的课程笔记 课程来源&#xff1a;ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com)课程资料&#xff1a;GitHub - wangshusen/RecommenderSystem 由于篇幅较长&#xff0c;分为【上】【下】两篇文章…

C#中的比较和逻辑运算符

在C#编程中&#xff0c;比较和逻辑运算符是控制程序流程和执行条件判断的重要工具。以下是C#中一些常用的比较和逻辑运算符及其示例。 相等运算符 运算符用于比较两个值是否相等。如果相等&#xff0c;返回 true&#xff1b;否则返回 false。 示例 int a 5, b 5; bool is…

【busybox记录】【shell指令】unlink

目录 内容来源&#xff1a; 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例&#xff1a; 删除文件 - 默认 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来源&#xff1a; GUN &#x…

深入解析Web前端三大主流框架:Angular、React和Vue

Web前端三大主流框架分别是Angular、React和Vue。下面我将为您详细介绍这三大框架的特点和使用指南。 Angular 核心概念: 组件(Components): 组件是Angular应用的构建块,每个组件由一个带有装饰器的类、一个HTML模板、一个CSS样式表组成。组件通过输入(@Input)和输出(…

【OrangePi AIpro】开箱初体验以及OAK深度相机测试

1. 简介 Orangepi AIPRO 是一款采用昇腾AI技术路线&#xff0c;集成4核64位处理器AI处理器的单板计算机&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接eMMC模块&#xff0c;支持双4K高清输出。 Orange Pi AIpr…

VirtualDisplay图像数据流trace分析

1. 计算器App更新图像帧&#xff08;QueuedBuffer - ViewRootImpl[Calculator]#0BLAST#0&#xff09;&#xff0c;调用eglSwapBuffersWithDamageKHR&#xff0c;然后queueBuffer向surfaceflinger提交图像buffer 2. sf调用latchBuffer获取buffer&#xff0c;进行一些状态的处理…

CBK-D2-安全与架构工程.md

CBK-D2-安全与架构工程 密码学和对称密钥算法 密码通信的基础知识 明文P-plaintext、加密encrypt、密文C-ciphertext、解密decrypt、密钥Key 多数情况下,密钥无非是一个极大的二进制数 每一种算法都有一个特定密钥控制key space,是一个特定的数值范围 密钥空间由位大小b…

数字图像处理系列 | 线性滤波(高斯滤波)(3)

我们知道了什么是 线性平移不变系统是在做卷积操作 之后&#xff0c;我们发展出了一些非常简单的 线性滤波&#xff0c; 去增强图片&#xff0c;提取图片特征 文章目录 1. 卷积如何在离散图片中工作的Vis 原图和mask做卷积时发生了什么首先&#xff0c;如何得到 (i.j)位置的卷积…

操作系统中的内存管理

虚拟内存 操作系统会提供一种机制&#xff0c;将不同进程的虚拟地址和不同内存的物理地址映射起来。如果程序要访问虚拟地址的时候&#xff0c;由操作系统转换成不同的物理地址&#xff0c;这样不同的进程运行的时候&#xff0c;写入的是不同的物理地址&#xff0c;这样就不会冲…

Python 技能提升(一)

python注释规范 # Add commit for you codes. # The proper addition of comments is so beautiful.from abc import abstractmethoddef add(a: int, b: int) -> int:# You can write some necessary notes here.# Such as the role of functions, the types and roles of …

Slurm集群使用基础

Introduction 我们在做生物信息分析时&#xff0c;对于大规模的上游数据的处理&#xff0c;一般需要在大型服务器或集群上进行。我最早接触并使用的是一个基于SLURM调度系统的集群&#xff0c;在此记录一下基础使用方法。 高性能计算集群&#xff08;High-Performance Comput…