Java泛型:桥接方法、重载与重写及类型限制

立即解锁
发布时间: 2025-08-17 02:35:38 阅读量: 38 订阅数: 46 AIGC
PDF

Java编程基础与SCJP认证指南

### Java泛型:桥接方法、重载与重写及类型限制 #### 1. 桥接方法 桥接方法是编译器插入到子类中的,以确保方法的重写能够正确工作。典型的例子是`Comparable`接口的实现。以下是`CmpNode<E>`类擦除后的代码: ```java class CmpNode extends Node implements Comparable { CmpNode(Object data, CmpNode next) { super(data, next); } public int compareTo(CmpNode node2) { // (1) return this.getData().compareTo(node2.getData()); } public int compareTo(Object node2) { // (2) return this.compareTo((CmpNode)node2); // Calls the method at (1). } } ``` 编译器在`(2)`处插入了第二个`compareTo()`方法,其方法签名为`compareTo(Object)`。这是必要的,因为如果没有这个方法,该类将无法正确实现`Comparable`接口,因为接口的`compareTo()`方法将无法被正确重写。 桥接方法不能在源代码中调用,它是为了与遗留代码保持向后兼容性而提供的。有一些Java反编译器可以用来检查编译器生成的代码。 #### 2. 方法签名对重载和重写的影响 ##### 2.1 方法签名的定义 方法签名在方法的重载和重写中起着至关重要的作用。方法签名由方法名和形式参数列表组成。两个方法(或构造函数)具有相同的签名,需要满足以下两个条件: - 它们具有相同的名称。 - 它们具有相同的形式参数类型。 两个方法(或构造函数)具有相同的形式参数类型,需要满足以下两个条件: - 它们具有相同数量的形式参数和类型参数。 - 在将其中一个的形式参数替换为另一个的相应类型后,形式参数和类型参数的边界相同。 如果满足以下两个条件之一,则方法`m()`的签名是另一个方法`n()`签名的子签名: - 方法`n()`与方法`m()`具有相同的签名。 - 方法`m()`的签名与方法`n()`签名的擦除相同。 如果满足以下两个条件之一,则两个方法`m()`和`n()`的签名是重写等效的: - 方法`m()`的签名是方法`n()`签名的子签名。 - 方法`n()`的签名是方法`m()`签名的子签名。 ##### 2.2 对重载的影响 根据上述定义,如果两个方法具有相同的名称,但它们的签名不是重写等效的,则这两个方法是重载的。例如,在一个类中有以下三个泛型方法声明: ```java static <T> void merge (MyStack<T> s1, MyStack<T> s2) { /*...*/ } static <T> void merge (MyStack<T> s1, MyStack<? extends T> s2) { /*...*/ } static <T> void merge (MyStack<T> s1, MyStack<? super T> s2) { /*...*/ } ``` 擦除后,这三个方法的签名都是`merge(MyStack, MyStack)`,即这些方法的签名是重写等效的,因此这些方法不是重载的。一个类不能包含两个签名重写等效的方法,编译器会报告错误。 而以下三个方法: ```java static <T> void merge (Node<T> s1, MyStack<T> s2) { /*...*/ } static <T> void merge (MyStack<T> s1, MyStack<? extends T> s2) { /*...*/ } static <T> void merge (MyStack<T> s1, Node<? super T> s2) { /*...*/ } ``` 擦除后的签名分别为: - `merge (Node, MyStack)` - `merge (MyStack, MyStack)` - `merge (MyStack, Node)` 可以看出,没有两个签名是重写等效的,因此这三个方法是重载的。 下面是`Sup`类的声明,展示了方法签名的一些变化: ```java class Sup<T> { void doIt(boolean b) { } // (1) void doIt(boolean) void doIt(T t) { } // (2) void doIt(Object) List<StringBuilder> doIt(StringBuilder sb) { // (3) List doIt(StringBuilder) return null; } <E extends Comparable<E>> void doIt(E element) // (4) void doIt(Comparable) { } <E> E doIt(MyStack<? extends E> stack) { // (5) Object doIt(MyStack) return null; } } ``` 向`Sup`类添加以下任何方法声明都会出错,因为每个方法声明的签名都与类中已有的某个方法相同,即签名是重写等效的: ```java void doIt(Object obj) { } // (2') void doIt(Object) <E extends StringBuilder> List<E> doIt(E sb) { // (3') List doIt(StringBuilder) return null; } void doIt(Comparable<T> element) { } // (4') void doIt(Comparable) <E> E doIt(MyStack<? super E> stack) { // (5') Object doIt(MyStack) return null; } ``` ##### 2.3 对重写的影响 为了使子类型方法重写超类型方法,应满足以下条件: - 子类型方法的签名是超类型方法签名的子签名。 - 它们的返回类型应该兼容。 - 它们的`throws`子句应该兼容。 这里主要讨论方法签名对重写的影响。 ##### 2.4 `@Override`注解 可以借助编译器来确保方法声明正确地重写了继承的方法。如果方法声明前面有`@Override`注解,当该方法没有重写继承的方法时,编译器会发出错误。 以下是使用该注解的示例: ```java class CmpNode<E extends Comparable<E>> extends Node<E> implements Comparable<CmpNode<E>> { CmpNode(E data, CmpNode<E> next) { super(data, next); } @Override public boolean equals(CmpNode node2) { // (1) Compile-time error. //public boolean equals(Object node2) { // (1') Correct header. return this.compareTo(node2) == 0; } @Override public int compareTo(Object node2) { // (2) Compile-time error. //public int compareTo(CmpNode<E> node2) { // (2') Correct header return this.getData().compareTo(node2.getData()); } } ``` 编译`CmpNode`类时,会出现错误提示,因为注解的方法没有重写任何继承的方法,方法签名不是继承的任何方法签名的子签名,形式参数对于重写来说是不正确的。 ##### 2.5 非泛型子类型中的非泛型方法重写非泛型超类型中的方法 在以下示例中: ```java class SupA { public void set(Integer ref) {/*...*/} // (1) public void set(List<Integer> lis ```
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

打印延迟问题深度剖析:从富士通DPK驱动到系统层的全链路排查

# 摘要 打印延迟问题是企业级打印服务中常见的性能瓶颈,严重影响工作效率与用户体验。本文围绕打印延迟问题,系统性地从打印机驱动层、操作系统打印子系统、网络通信层以及应用层等多个技术层面展开分析,深入探讨各层级可能引发延迟的成因,并结合排查方法与优化策略提出综合性解决方案。通过日志分析、性能调优、协议优化及并发控制等手段,本文构建了一套完整的打印延迟问题诊断与优化体系,并通过实际案例验证了方法的有效性,为企业构建高效稳定的打印服务架构提供了理论支持与实践指导。 # 关键字 打印延迟;驱动兼容性;打印子系统;网络协议;性能调优;并发控制 参考资源链接:[富士通dpk系列打印机NFCP

AGC在音频系统中的实战应用:从理论到电路实现的完整路径

# 摘要 自动增益控制(AGC)是音频系统中实现音量稳定与信号优化的关键技术,广泛应用于语音通信、智能设备及专业音频处理领域。本文系统阐述了AGC的基本概念、理论基础及其在音频系统中的核心作用,深入分析了其工作原理、数学模型以及与其他音频处理模块的协同机制。同时,文章详细探讨了AGC在软件与硬件层面的实现方法,包括数字平台的算法设计、实时处理流程、参数调优策略及嵌入式系统的集成方案。结合典型应用场景,如会议系统、智能音箱和广播设备,本文展示了AGC在提升语音质量和环境适应性方面的实际效果,并为后续音频增益控制技术的优化与创新提供了理论支持与实践指导。 # 关键字 自动增益控制;音

自动驾驶感知升级:偏振摄像头的5大核心优势揭秘

![自动驾驶感知升级:偏振摄像头的5大核心优势揭秘](https://avitechhub.com/wp-content/uploads/2024/03/Drone_flying_in_rain_web-1024x576.jpg) # 摘要 随着自动驾驶技术的快速发展,感知系统的精准性与可靠性成为研究重点。偏振摄像头因其在复杂光照、恶劣天气及材质识别等方面的独特优势,逐渐成为自动驾驶感知技术的重要组成部分。本文系统梳理了偏振摄像头的发展背景、成像原理及其在自动驾驶中的关键应用,深入分析其硬件结构、数据处理流程及多场景适应能力。同时,探讨了偏振摄像头在实际部署中面临的系统集成、算力需求与技

多线程环境下的卡尺测量优化:OpenCV并发处理的3大核心技巧

# 摘要 本文围绕多线程技术在图像处理中的应用展开研究,重点分析OpenCV中的并发处理机制及其在卡尺测量算法优化中的实践。文章首先介绍多线程与图像处理的基础概念,继而深入探讨OpenCV支持多线程的机制、线程池管理策略以及资源竞争问题的解决方案。随后,通过卡尺测量算法的并行优化案例,分析单帧与多帧图像的并发处理方法,并评估其性能提升效果。最后,文章提出多线程环境下系统性能优化和稳定性增强的关键策略,包括内存管理、异常处理及系统调优方案,为高性能图像处理系统的开发提供技术参考。 # 关键字 多线程;图像处理;OpenCV;卡尺测量;并发处理;线程池 参考资源链接:[一维卡尺测量与

BCH生成矩阵存储与压缩技术:节省内存的5大实用技巧与实现方案

![BCH生成矩阵存储与压缩技术:节省内存的5大实用技巧与实现方案](https://developer-blogs.nvidia.com/wp-content/uploads/2023/06/2-4-structured-sparsity-pattern.png) # 摘要 BCH码是一种重要的循环纠错码,广泛应用于现代通信和数据存储系统中。本文围绕BCH码的生成矩阵展开系统研究,深入分析其数学基础、结构特性及生成原理,重点探讨生成矩阵在实际应用中所面临的存储瓶颈与性能限制。针对大规模矩阵带来的内存压力,本文提出五种实用的压缩与优化技巧,包括稀疏结构识别、循环特性压缩、按需生成、位操作

【AD9954时钟分配与阻抗匹配】:高速时钟链设计的关键要点

![【AD9954时钟分配与阻抗匹配】:高速时钟链设计的关键要点](https://www.protoexpress.com/wp-content/uploads/2023/05/aerospace-pcb-design-rules-1024x536.jpg) # 摘要 本文围绕AD9954芯片在高速时钟链设计中的应用,系统阐述了时钟分配与阻抗匹配的关键技术问题。从高速信号传输的基本原理出发,深入解析AD9954的架构与功能,探讨其在复杂系统中的时钟生成与分配机制。结合PCB设计实践,提出了优化信号完整性的布局布线策略、电源去耦方案及阻抗适配方法,并通过测量与仿真验证设计有效性。文章进一

【MFC网络功能拓展】:一键上传分享截图的HTTP集成指南(含HTTPS安全传输方案)

![MFC截图(仿QQ截图)](https://www.befunky.com/images/wp/wp-2022-07-batch-watermark-step-5-create-watermark.jpg?auto=avif,webp&format=jpg&width=944) # 摘要 本文围绕基于MFC平台实现截图上传功能的技术方案展开,系统性地分析了MFC网络通信机制、HTTP/HTTPS协议应用及截图处理流程。首先,文章解析了HTTP协议结构与MFC网络编程接口,构建了基础网络通信框架,并实现文件上传功能。随后,详细阐述了截图功能的界面设计、图像处理方法及其与上传逻辑的整合,

滤波器失配补偿方法论:信道化系统稳定性提升的底层逻辑

![信道化仿真代码-多相滤波](https://connecthostproject.com/images/8psk_table_diag.png) # 摘要 滤波器失配是影响信道化系统性能的关键因素,可能导致信道间串扰、频谱泄漏以及系统稳定性下降等问题。本文系统地分析了滤波器失配的成因与分类,深入探讨其在时域与频域的表现形式及量化方法。基于系统辨识与参数估计理论,研究了多种补偿算法的数学基础及其收敛性与稳定性条件。进一步地,本文提出了适用于嵌入式系统和FPGA/DSP平台的补偿架构设计与硬件加速实现方案,并通过实际测试验证了补偿效果。最后,结合多层级补偿机制与鲁棒控制理论,提出提升系统

误差来源全面曝光:斜边法MTF计算的校正方法研究

# 摘要 斜边法是光学成像系统中常用的调制传递函数(MTF)测量方法,但其在实际应用中存在多种误差来源,影响测量精度。本文系统阐述了斜边法MTF计算的基本原理,深入分析了光学系统像差、探测器响应非理想、边缘定位误差、环境噪声等导致测量偏差的关键因素。在此基础上,构建了基于数学建模的误差校正理论框架,提出了多项式拟合与误差补偿策略,并通过实验验证了校正模型的有效性与适应性。研究结果为提升MTF测量精度提供了理论支持和技术路径,同时为工程实践中实现高精度、实时MTF检测提供了可行方案。 # 关键字 斜边法;MTF;误差校正;光学像差;边缘响应;傅里叶变换 参考资源链接:[图像斜边MT

【Python类异常处理设计之道】:优雅处理错误与异常的全面方案

![【Python类异常处理设计之道】:优雅处理错误与异常的全面方案](https://img-blog.csdnimg.cn/img_convert/003bf8b56e64d6aee2ddc40c0dc4a3b5.webp) # 摘要 本文系统探讨了Python异常处理的核心理念、理论结构及其在实际开发中的应用策略。从基本语法出发,分析了异常处理的机制、分类及执行流程,并深入讨论了自定义异常的设计原则与常见设计模式。文章结合函数、模块及Web应用等实际场景,阐述了异常处理在不同层级的实践方法,并探讨了异常在系统级错误恢复、日志记录及安全控制中的关键作用。同时,针对性能瓶颈与调试难题,