首先,泛型不具备继承性,但是数据具备继承性

1.核心概念解析

泛型不具备继承性

  • 即使类型A是类型B的子类,Generic<A>也不是Generic<B>的子类
  • 这是Java泛型的类型安全设计,防止不安全的类型转换

数据具备继承性

  • 泛型容器中的元素仍遵循Java继承规则
  • 可以通过通配符(extends/super)在泛型中利用数据的继承关系
import java.util.*;class Animal {void eat() {System.out.println("Animal eating");}
}class Dog extends Animal {void bark() {System.out.println("Dog barking");}
}public class GenericInheritanceDemo {public static void main(String[] args) {// 1. 泛型不具备继承性演示List<Animal> animals = new ArrayList<>();List<Dog> dogs = new ArrayList<>();// 编译错误:泛型不具备继承性// animals = dogs;  // 错误: 不兼容的类型// 2. 数据具备继承性演示// 创建混合动物列表List<Animal> animalList = new ArrayList<>();animalList.add(new Dog());  // √ Dog是Animal子类animalList.add(new Cat());  // √ Cat是Animal子类}
}

2.泛型通配符详解

泛型通配符是Java泛型中处理未知或不确定类型的重要机制,主要有三种形式:

(1). 无界通配符 <?>

表示可以接受任何类型的参数化类型。

public static void printList(List<?> list) {for (Object item : list) {System.out.print(item + " ");}System.out.println();
}// 使用示例
List<String> stringList = Arrays.asList("A", "B", "C");
List<Integer> intList = Arrays.asList(1, 2, 3);
printList(stringList); // 输出:A B C
printList(intList);    // 输出:1 2 3

(2). 上界通配符 <? extends T>

表示参数化类型是T或其子类,用于"生产者"场景(从结构中获取元素)。

public static double sum(List<? extends Number> list) {double sum = 0.0;for (Number num : list) {sum += num.doubleValue();}return sum;
}// 使用示例
List<Integer> intList = Arrays.asList(1, 2, 3);
List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);
System.out.println(sum(intList));    // 输出:6.0
System.out.println(sum(doubleList)); // 输出:6.6

(3). 下界通配符 <? super T>

表示参数化类型是T或其父类,用于"消费者"场景(向结构中添加元素)。

public static void addNumbers(List<? super Integer> list) {for (int i = 1; i <= 5; i++) {list.add(i);}
}// 使用示例
List<Object> objectList = new ArrayList<>();
addNumbers(objectList);
System.out.println(objectList); // 输出:[1, 2, 3, 4, 5]

3.综合示例代码

编写一个方法,该方法接受一个列表并检查其中是否包含特定元素。如果包含,则返回该元素;否则,返回默认值。

import java.util.List;public class WildcardDemo {public static <T> T findElementOrDefault(List<T> list, T element, T defaultValue) {for (T item : list) {if (item.equals(element)) {return item;}}return defaultValue;}public static void main(String[] args) {List<String> stringList = List.of("Apple", "Banana", "Cherry");List<Integer> intList = List.of(1, 2, 3);String foundString = findElementOrDefault(stringList, "Banana", "Not Found");Integer foundInt = findElementOrDefault(intList, 4, -1);System.out.println("Found String: " + foundString); // 输出:Found String: BananaSystem.out.println("Found Int: " + foundInt);       // 输出:Found Int: -1}
}

4.关键点解释

泛型不具备继承性

  • List<Dog>不能赋值给List<Animal>(编译错误)
  • 防止将Cat添加到Dog列表中破坏类型安全

数据具备继承性

  • Dog对象可以添加到List<Animal>中(向上转型)
  • List<Animal>中可以调用所有Animal的方法

通配符连接泛型与继承

  • <? extends Animal>:接受所有Animal子类的列表
  • <? super Animal>:接受所有Animal父类的列表
  • 通配符在泛型系统中建立与继承体系的连接

类型转换规则

  • 泛型容器内元素可以安全向上转型
  • 向下转型需要显式类型检查和转换
  • 通配符在编译时保证类型安全操作

什么时候使用<T>,什么时候使用<?>

  • 使用<T>当你需要:
    • 声明类型变量
    • 在方法或类中引用该类型
    • 需要向集合中添加元素
  • 使用<?>当你:
    • 只关心读取集合中的元素
    • 不需要知道具体类型
    • 不需要向集合中添加元素

        设计本质:Java泛型通过"类型擦除"实现,运行时所有泛型类型都变成Object。通配符系统是在编译器层面建立的类型安全规则,利用继承体系实现灵活性与类型安全的平衡。

5.PECS原则(Producer-Extends, Consumer-Super)

原则解析

  • Producer-Extends: 当需要从数据结构获取数据时使用<? extends T>
  • Consumer-Super: 当需要向数据结构存入数据时使用<? super T>

        本文探讨了Java泛型与继承的关系。泛型本身不具备继承性(如List&lt;Dog&gt;不是List&lt;Animal&gt;的子类),但容器中的元素仍遵循继承规则。通过上界通配符&lt;? extends T&gt;可接受T及其子类,下界通配符&lt;? super T&gt;可接受T及其父类。泛型方法利用类型参数&lt;T extends Animal&gt;可实现安全类型转换。这些特性在编译时确保类型安全,防止运行时错误,同时灵活利用继承关系处理不同类型数据。

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

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

相关文章

如何实现在多跳UDP传输场景,保证单文件和多文件完整传输的成功率?

如何实现在多跳UDP传输场景&#xff0c;保证单文件和多文件完整传输的成功率&#xff1f; 一、前言 UDP&#xff08;User Datagram Protocol&#xff09;是一个轻量、无连接的传输协议&#xff0c;广泛用于低延迟、高吞吐的应用中&#xff0c;如视频流、实时游戏等。然而&…

【Spring IoC 核心实现类详解:DefaultListableBeanFactory】

Spring IoC 核心实现类详解&#xff08;源码原理&#xff09;作为 Spring 的灵魂&#xff0c;IoC 容器&#xff08;Inversion of Control&#xff09;是整个框架的核心。 那么 IoC 的“心脏”到底是哪个类&#xff1f;它是怎么管理和装配 Bean 的&#xff1f;本文将从源码层面深…

为什么开启JWT全局认证后,CSRF失败会消失?

这是因为 JWT认证与CSRF校验的设计逻辑完全不同&#xff0c;当全局启用JWT认证后&#xff0c;Django的CSRF校验会被“绕过”或不再生效&#xff0c;具体原因如下&#xff1a; 核心原因&#xff1a;JWT认证不依赖Cookie&#xff0c;无需CSRF保护 1. CSRF的作用场景 CSRF攻击的前…

宝龙地产债务化解解决方案二:基于资产代币化与轻资产转型的战略重构

一、行业背景与代币化创新趋势1.1 房地产债务危机现状宝龙地产&#xff08;01238.HK&#xff09;截至2024年中债务总额达584亿元&#xff0c;其中50.7%为一年内到期债务&#xff0c;但现金储备仅89.47亿元&#xff0c;短期偿债覆盖率不足30%。2025年2月境外债务重组计划因债权人…

深信服GO面试题及参考答案(下)

Kubernetes 与容器 Kubernetes(简称 K8s)是容器编排平台,而容器是轻量级的虚拟化技术,两者紧密关联但定位不同,容器是 K8s 管理的核心对象,K8s 为容器提供了完整的生命周期管理、扩展和运维能力。 容器技术(如 Docker)通过 Linux 命名空间(Namespace)、控制组(CGro…

RAGFoundry:面向检索增强生成的模块化增强框架

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. 背景与动机 大型语言模型&#xff08;LLMs&#xff09;存在 知识静…

(第十期)HTML基础教程:文档类型声明与字符编码详解

&#xff08;第十期&#xff09;HTML基础教程&#xff1a;文档类型声明与字符编码详解 前言 在使用VS Code等现代编辑器生成HTML页面时&#xff0c;你会发现自动生成的代码中多了一些看似陌生但又非常重要的标签。这些标签不是多余的&#xff0c;而是现代Web开发的标准配置。…

OpenAPI(Swagger3)接口文档自定义排序(万能大法,支持任意swagger版本)

前置参考文档 基于OpenAPI(Swagger3)使用AOP技术&#xff0c;进行日志记录 使用SpringAOP的方式修改controller接口返回的数据 SpringBoot3集成OpenAPI3(解决Boot2升级Boot3) 总结一句话&#xff1a;既然没办法去通过各种方法或者官方的接口去修改接口顺序&#xff0c;那我们就…

vue3上传的文件在线查看

1、npm install vue-office/pdf vue-demi 安装依赖2、npm install vue-office/excel vue-demi 安装依赖3、npm install vue-office/docx vue-demi 安装依赖4、编写一个通用组件&#xff0c;现在只支持 .docx,.xlsx,.pdf 格式的文件&#xff0c;其他文件渲染不成功<temp…

深度学习中基于响应的模型知识蒸馏实现示例

在 https://blog.csdn.net/fengbingchun/article/details/149878692 中介绍了深度学习中的模型知识蒸馏&#xff0c;这里通过已训练的DenseNet分类模型&#xff0c;基于响应的知识蒸馏实现通过教师模型生成学生模型&#xff1a; 1. 依赖的模块如下所示&#xff1a; import arg…

【数据可视化-82】中国城市幸福指数可视化分析:Python + PyEcharts 打造炫酷城市幸福指数可视化大屏

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

TikTok网页版访问障碍破解:IP限制到高效运营的全流程指南

在跨境电商与社媒运营的数字化浪潮中&#xff0c;TikTok网页版因其多账号管理便捷性、内容采集高效性等优势&#xff0c;成为从业者的核心工具&#xff0c;然而“页面空白”“地区不支持” 等访问问题却频繁困扰用户。一、TikTok网页版的核心应用场景与技术特性&#xff08;一&…

spring的知识点:容器、AOP、事物

一、Spring 是什么? Spring 是一个开源的 Java 企业级应用框架,它的核心目标是简化 Java 开发。 它不是单一的工具,而是一个 “生态系统”,包含了很多模块(如 Spring Core、Spring Boot、Spring MVC 等),可以解决开发中的各种问题(如对象管理、Web 开发、事务控制等)…

HTML ISO-8859-1:深入解析字符编码标准

HTML ISO-8859-1:深入解析字符编码标准 引言 在HTML文档中,字符编码的选择对于确保网页内容的正确显示至关重要。ISO-8859-1是一种广泛使用的字符编码标准,它定义了256个字符,覆盖了大多数西欧语言。本文将深入探讨HTML ISO-8859-1的原理、应用及其在现代网页开发中的重要…

【计算机网络 | 第4篇】分组交换

文章目录前言&#x1f95d;电路交换&#x1f34b;电路交换技术的优缺点电路交换的资源分配机制报文交换&#x1f34b;报文交换技术的优缺点存储转发技术分组交换&#x1f426;‍&#x1f525;分组交换的过程分组交换解决的关键问题传输过程的关键参数工作原理分组传输时延计算网…

LLM - AI大模型应用集成协议三件套 MCP、A2A与AG-UI

文章目录1. 引言&#xff1a;背景与三协议概览2. MCP&#xff08;Model Context Protocol&#xff09;起源与动因架构与规范要点开发实践3. A2A&#xff08;Agent-to-Agent Protocol&#xff09;起源与动因架构与规范要点开发实践4. AG-UI&#xff08;Agent-User Interaction P…

机器学习DBSCAN密度聚类

引言 在机器学习的聚类任务中&#xff0c;K-means因其简单高效广为人知&#xff0c;但它有一个致命缺陷——假设簇是球形且密度均匀&#xff0c;且需要预先指定簇数。当数据存在任意形状的簇、噪声点或密度差异较大时&#xff0c;K-means的表现往往不尽如人意。这时候&#xff…

RecyclerView 缓存机制

一、四级缓存体系1. Scrap 缓存&#xff08;临时缓存&#xff09;位置&#xff1a;mAttachedScrap 和 mChangedScrap作用&#xff1a;存储当前屏幕可见但被标记为移除的 ViewHolder用于局部刷新&#xff08;如 notifyItemChanged()&#xff09;特点&#xff1a;生命周期短&…

大模型SSE流式输出技术

文章目录背景&#xff1a;为什么需要流式输出SSE 流式输出很多厂商还是小 chunk背景&#xff1a;为什么需要流式输出 大模型的响应通常很长&#xff0c;比如几百甚至几千个 token&#xff0c;如果等模型一次性生成完才返回&#xff1a; 延迟高&#xff1a;用户要等很久才能看…

[Flutter] v3.24 AAPT:错误:未找到资源 android:attr/lStar。

推荐超级课程&#xff1a; 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 前提 将 Flutter 升级到 3.24.4 后&#xff0c;构建在我的本地电脑上通过&#xff0c;但Github actions 构建时失败。 Flutt…