134. Java 泛型 - 上限通配符

文章目录

  • 134. Java 泛型 - 上限通配符 (`? extends T`)
    • **1. 什么是上限通配符 (`? extends T`)?**
    • **2. 为什么使用 `? extends T`?**
    • **3. 示例:使用 `? extends T` 进行数据读取**
      • **✅ 示例 1:计算数值列表的总和**
    • **4. 注意事项:为什么不能向 `List<? extends T>` 添加元素?**
      • **❌ 错误示例**
    • **5. 适用场景**
    • **6. 结论**

134. Java 泛型 - 上限通配符 (? extends T)

在 Java 泛型中,我们可以使用上限通配符 (? extends T) 来放宽对变量的限制,使方法能够适用于某个类型及其所有子类型。

让我们深入了解它的概念,并通过示例加深理解。


1. 什么是上限通配符 (? extends T)?

在泛型中,我们可以使用 ? extends T 来表示“某个类 T 及其所有子类”。

  • 其中,extends 在这里不仅表示类的继承,也可以用于接口的实现
  • 这在处理同一类层级中的不同泛型类型时非常有用。

语法

List<? extends Number> list;
  • list 可以接受 List<Number>List<Integer>List<Double>List<Float> 等。
  • 但是,不能向 list 中添加元素(除了 null),因为 Java 无法确定具体的子类型。

2. 为什么使用 ? extends T

假设我们需要编写一个方法,它能够接受 List<Integer>List<Double>List<Number>,而不需要为每个具体类型单独编写方法。

使用 ? extends T 可以让方法适用于T 及其子类,避免代码重复,增强通用性。


3. 示例:使用 ? extends T 进行数据读取

📌 需求:编写一个方法计算 List<Number> 及其子类(如 IntegerDouble)的总和。

✅ 示例 1:计算数值列表的总和

import java.util.Arrays;
import java.util.List;public class UpperBoundWildcard {public static double sumOfList(List<? extends Number> list) {double sum = 0.0;for (Number n : list) {sum += n.doubleValue(); // ✅ 可以安全地调用 Number 的方法}return sum;}public static void main(String[] args) {List<Integer> integers = Arrays.asList(1, 2, 3);System.out.println("Sum of integers: " + sumOfList(integers)); // 输出: 6.0List<Double> doubles = Arrays.asList(1.2, 2.3, 3.5);System.out.println("Sum of doubles: " + sumOfList(doubles)); // 输出: 7.0}
}

🔍 解析

  • sumOfList(List<? extends Number> list) 接受 Number 及其所有子类
  • list 可以是 List<Integer>List<Double>List<Float> 等。
  • n.doubleValue()安全调用 Number 类的方法,因为所有 Number 的子类都继承了 doubleValue()

4. 注意事项:为什么不能向 List<? extends T> 添加元素?

List<? extends T> 中,我们无法添加元素(除了 null),否则会导致编译错误。

❌ 错误示例

List<? extends Number> list = new ArrayList<Integer>();
list.add(5);  // ❌ 编译错误
list.add(3.14); // ❌ 编译错误

🔍 为什么?

  • list 可能是 List<Integer>,但 list.add(3.14) 试图添加 Double,这会破坏 List<Integer> 的类型安全性。
  • Java 编译器无法确保 list 的实际类型,因此不允许添加元素,但可以安全读取元素(因为所有元素都是 Number)。

✅ 解决方案

List<Number> list = new ArrayList<>();
list.add(5);      // ✅ 允许
list.add(3.14);   // ✅ 允许

如果需要向列表添加元素,就不能使用 ? extends T,而应该使用具体类型 T


5. 适用场景

适用于只“读取”数据的情况(Producer)。
适用于同一继承层级中的多个泛型类型(如 Number 的子类)。
适用于通用方法,使代码更具灵活性


6. 结论

? extends T 表示 T 及其所有子类,适用于“读取”数据的情况
无法向 List<? extends T> 添加元素,因为 Java 无法确保其实际类型。
使用 ? extends T 可以增强代码的通用性,避免代码重复
典型用法:计算数值列表的总和,遍历对象并调用父类方法


🎯 记住口诀:

  • Producer Extends (? extends T) 👉 用于“读取”数据
  • Consumer Super (? super T) 👉 用于“写入”数据

🚀 泛型让 Java 代码更灵活,学会 ? extends T,让你的代码更通用!

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

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

相关文章

【1】YOLOv13 AI大模型-可视化图形用户(GUI)界面系统开发

【文章内容适用于任意目标检测任务】【GUI界面系统不局限于YOLOV13&#xff0c;主流YOLO系列模型同样适用】本文以车辆行人检测为背景&#xff0c;介绍基于【YOLOV13模型】和【AI大模型】的图形用户&#xff08;GUI&#xff09;界面系统的开发。助力大论文实现目标检测模型的应…

小程序常用api

1. wx.request - 发起网络请求 用于向服务器发送 HTTP 请求&#xff0c;获取数据或提交表单。 // 示例&#xff1a;GET 请求获取数据 wx.request({url: https://api.example.com/data, // 替换为实际 API 地址method: GET,success: (res) > {console.log(请求成功, res.da…

PaliGemma 2-轻量级开放式视觉语言模型

PaliGemma 2是轻量级开放式视觉语言模型 (VLM)&#xff0c;灵感源自 PaLI-3&#xff0c;基于 SigLIP 视觉模型和 Gemma 语言模型等开放式组件。PaliGemma 同时接受图片和文本作为输入&#xff0c;并且可以回答有关图片的详细问题和背景信息。PaliGemma 2 提供 30 亿、100 亿和 …

腾讯云云服务器深度介绍

以下是围绕腾讯云云服务器&#xff08;CVM&#xff09;的详细介绍与推荐文章&#xff0c;结合其核心优势、应用场景及技术特性&#xff0c;为不同用户群体提供参考&#xff1a; &#x1f680; 一、产品定位与核心价值 腾讯云云服务器&#xff08;Cloud Virtual Machine, CVM&a…

Ceph OSD.419 故障分析

Ceph OSD.419 故障分析 1. 问题描述 在 Ceph 存储集群中&#xff0c;OSD.419 无法正常启动&#xff0c;系统日志显示服务反复重启失败。 2. 初始状态分析 观察到 OSD.419 服务启动失败的系统状态&#xff1a; systemctl status ceph-osd419 ● ceph-osd419.service - Ceph obje…

MySQL持久化原理及其常见问题

目录 MySQL刷盘原理 脏页和干净页 MySQL出现短暂的堵塞SQL现象 情况分析 应对措施 数据库表中数据删除原理 删除表中数据数据库空间大小不会改变 情况分析 应对措施 MySQL刷盘原理 一般主要分为两个步骤 内存更新和 redo log 记录是同一事务修改的两个必要操作&#…

VSCode中Cline无法正确读取终端的问题解决

出现的问题是&#xff1a;Cline 无法正确读取终端输出。 Shell Integration Unavailable Cline won’t be able to view the command’s output. Please update VSCode (CMD/CTRL Shift P → “Update”) and make sure you’re using a supported shell: zsh, bash, fish, o…

scalelsd 笔记 线段识别 本地部署 模型架构

ant-research/scalelsd | DeepWiki https://arxiv.org/html/2506.09369?_immersive_translate_auto_translate1 https://gitee.com/njsgcs/scalelsd https://github.com/ant-research/scalelsd https://huggingface.co/cherubicxn/scalelsd 模型链接&#xff1a; https…

Python, C ++开发个体户/个人品牌打造APP

个体户/个人品牌打造APP开发方案&#xff08;Python C&#xff09;一、技术选型与分工1. Python- 核心场景&#xff1a;后端API开发、数据处理、内容管理、第三方服务集成&#xff08;如社交媒体分享、支付接口&#xff09;。- 优势&#xff1a;开发效率高&#xff0c;丰富的库…

SQLAlchemy 常见问题笔记

文章目录SQLAlchemy Session对象如何操作数据库SQLAlchemy非序列化对象如何返回1.问题分析2.解决方案方法1&#xff1a;使用 Pydantic 响应模型&#xff08;推荐&#xff09;方法2&#xff1a;手动转换为字典&#xff08;简单快速&#xff09;方法3&#xff1a;使用 SQLAlchemy…

Shell脚本-uniq工具

一、前言在 Linux/Unix 系统中&#xff0c;uniq 是一个非常实用的文本处理命令&#xff0c;用于对重复的行进行统计、去重和筛选。它通常与 sort 搭配使用&#xff0c;以实现高效的文本数据清洗与统计分析。无论是做日志分析、访问频率统计&#xff0c;还是编写自动化脚本&…

氛围编码(Vice Coding)的工具选择方式

一、前言 在写作过程中&#xff0c;我受益于若干优秀的博客分享&#xff0c;它们给予我宝贵的启发&#xff1a; 《5分钟选对AI编辑器&#xff0c;每天节省2小时开发时间让你早下班&#xff01;》&#xff1a;https://mp.weixin.qq.com/s/f0Zm3uPTcNz30oxKwf1OQQ 二、AI编辑的…

[硬件电路-57]:根据电子元器件的受控程度,可以把电子元器件分为:不受控、半受控、完全受控三种大类

根据电子元器件的受控程度&#xff0c;可将其分为不受控、半受控、完全受控三大类。这种分类基于元器件的工作状态是否需要外部信号&#xff08;如电压、电流、光、热等&#xff09;的主动调控&#xff0c;以及调控的精确性和灵活性。以下是具体分类及实例说明&#xff1a;一、…

基于Pytorch的人脸识别程序

人脸识别原理详解人脸识别是模式识别和计算机视觉领域的重要研究方向&#xff0c;其目标是从图像或视频中识别出特定个体的身份。现代人脸识别技术主要基于深度学习方法&#xff0c;特别是卷积神经网络 (CNN)&#xff0c;下面从多个维度详细解析其原理&#xff1a;1. 人脸识别的…

ubuntu 开启ssh踩坑之旅

文章目录确认当前用户为普通用户 or root命令使用ssh还是sshd服务名称的由来apt update和apt upgrade的关系apt upgrade报错&#xff1a;“E: 您在 /var/cache/apt/archives/ 上没有足够的可用空间”开启ssh步骤错误排查查看日志修改sshd_config文件允许防火墙通过22端口确认当…

力扣:动态规划java

sub07 线性DP - O(1) 状态转移2_哔哩哔哩_bilibili 跳楼梯 class Solution {public int climbStairs(int n) {if (n < 1) {return 1; // 处理边界情况}int[] dp new int[n 1]; // 创建长度为n1的数组&#xff0c;比方说跳二级楼梯dp[0] 1; // 初始值设定dp[1] 1;for (…

React Native打开相册选择图片或拍照 -- react-native-image-picker

官方文档&#xff1a;https://www.npmjs.com/package/react-native-image-picker 场景&#xff1a;点击按钮打开相册选择图片或者点击按钮拍照 import { launchCamera, launchImageLibrary } from react-native-image-picker;// ... <TouchableOpacityactiveOpacity{0.7}o…

USRP B210生成信号最大带宽测试之Frank

书接上文&#xff1a; USRP B210生成LFM,SFM,BPSK,Frank信号的最大带宽测试&#xff08;一&#xff09; USRP B210生成信号最大带宽测试&#xff08;二&#xff09;SFM USRP B210生成信号最大带宽测试&#xff08;三&#xff09;LFM USRP B210生成信号最大带宽测试之BPSK …

pages.json页面路由中,globalStyle的各个属性

欢迎来到我的UniApp技术专栏&#xff01;&#x1f389; 在这里&#xff0c;我将与大家分享关于UniApp开发的实用技巧、最佳实践和项目经验。 专栏特色&#xff1a; &#x1f4f1; 跨平台开发一站式解决方案 &#x1f680; 从入门到精通的完整学习路径 &#x1f4a1; 实战项目经…

[前端技术基础]CSS选择器冲突解决方法-由DeepSeek产生

在 CSS 中&#xff0c;当多个选择器对同一元素的相同属性&#xff08;如颜色&#xff09;定义发生冲突时&#xff0c;浏览器会通过层叠规则&#xff08;Cascading&#xff09;解决冲突。具体优先级从高到低如下&#xff1a;1. !important 规则&#xff08;最高优先级&#xff0…