news 2026/6/10 11:20:33

Java泛型---桥方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java泛型---桥方法

桥方法

桥方法是为了解决类型擦除后与多态的冲突。为了理解什么是桥方法。下面举实例,假设有一个泛型类Pair,它用来保存两个值,first与second,first永远比second大。
现在,创建一个子类去继承它。

/* by yours.tools - online tools website : yours.tools/zh/calcvolume.html */ package Test; import java.time.LocalDate; public class Pair<T> { private T first; private T second; public Pair(){}; public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public void setFirst(T first) { this.first = first; } public T getSecond() { return second; } public void setSecond(T second) { this.second = second; } } class DateInterval extends Pair<LocalDate> { public void setSecond(LocalDate second){ if(second.compareTo(getFirst()) >=0) super.setSecond(second); } }

那么呢,这个子类重写了父类的setSecond,这是我们的意图,要去重写这个方法,那么注意看子类的方法。由于它继承的是Pair类,所以这个方法的参数也要是LocalData,毕竟要时这个日期保持在第二。现在回到泛型类Pair,它的方法类型擦除后是什么样子

/* by yours.tools - online tools website : yours.tools/zh/calcvolume.html */ public void setSecond(Object second){ this.second = second; }

很明显,两个方法的参数不一样,并没有达到重写的目的,而是变成了重载。问题就在这里,如果我们编写下面的代码

DateInterval dateInterval = new DateInterval(); //创建一个实例 Pair<LocalDate> pair = dateInterval; //父类引用子类实例 pair.setSecond(LocalDate.now());

上面的代码是典型的多态概念的体现,根据对象的实际类型而非声明类型来决定调用哪个方法的过程,所以此时,预期中肯定是调用实例的方法。但此时,多态特性与类型擦除产生了冲突,编译器会生成一个桥方法。如果没有桥方法,那它会调用本身的方法,也就是原始类型的setsecond(Objects second)方法。为了解决这个问题,编译器在DateInterval类中生成一个桥方法

public void setSecond(Object second){ setSecond((LocalData) Second); }

强制调用预期的方法。这就是桥方法,通过搭建一座看不见的桥,使程序符合Java特性。然而,这样看不见的特性,怎么去证明它确实存在?其一是,这样的桥方法是编译器自动生成,如果你手动编写这样的方法,会与编译器生成的产生冲突,从而报错。

其二是通过JDK自带查看字节码的工具,对编译后的.class文件执行以下命令。
bash javap -c -v DataInterval.class

欲重写父类的方法字节码

编译器自动生成的setSecond方法,可以很明显的看到它方法的参数是Object。至于其余的代码,我们主要看这一行:
java 5: invokevirtual #25 // Method setSecond:(Ljava/time/LocalDate;)V

类似的,重写父类的get方法

class DateInterval extends Pair<LocalDate> { //编译器自动生成桥方法 public LocalDate getSecond(){ //返回父类的second值并转为LocalDate类 return (LocalDate) super.getSecond(); } }

编译器会生成下面的桥方法

LocalDate getSecond(); Object getSecond();//父类继承

总之,对Java泛型的转换,记住以下几点:

  • 虚拟机中没有泛型,只有普通的类和方法。
  • 所有类型参数都会替换为他们的限定类型。
  • 会合成桥方法来保持多态
  • 为保持类型安全性,必要时会强制插入类型转换。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 18:02:36

STM32F0实战:基于HAL库开发【1.3】

2.2.2 STM32系统板 STM32F072VBT6微控制器采用LQFP100封装,引脚间距仅为0.5mm,这样的封装很难用手工的方法搭建系统板,所以建议使用成品的系统板或者全功能开发板来完成本书的代码测试任务。 STM32F072VBT6系统板的外观如图2-75所示,系统板电路原理可以参考本书附录A,全…

作者头像 李华
网站建设 2026/4/29 10:33:43

Java String 字符串终极详解(全特性+全API+全示例)

一、String 基础定义与底层实现 1.1 核心定义 String 是 Java 中用于表示不可变字符序列的引用类型&#xff0c;位于 java.lang 包下。JVM 会自动加载该包&#xff0c;无需手动导入。它并非 8 种基本数据类型&#xff08;byte、short、int、long、float、double、char、boolean…

作者头像 李华
网站建设 2026/6/10 14:30:00

【课程设计/毕业设计】基于微信小程序的校园导航与信息服务系统基于springboot+微信小程序的校园导航与信息服务系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/9 19:39:55

小程序计算机毕设之基于springboot+微信小程序的驾校在线学习考试小程序驾考在线学习与测试系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 17:50:24

5分钟部署Sambert语音合成:多情感AI配音开箱即用

5分钟部署Sambert语音合成&#xff1a;多情感AI配音开箱即用 1. 引言&#xff1a;多情感语音合成的工程落地挑战与解决方案 随着虚拟主播、智能客服、有声内容创作等应用场景的快速发展&#xff0c;用户对语音合成&#xff08;TTS&#xff09;系统的要求已从“能说”升级为“…

作者头像 李华
网站建设 2026/6/6 5:12:20

期刊论文投稿难?宏智树 AI:从选题到录用的智能通关指南

在学术发表竞争白热化的当下&#xff0c;一篇期刊论文从构思到见刊&#xff0c;往往要经历选题碰壁、文献堆砌、格式错乱、查重超标等多重考验。据《自然》期刊统计&#xff0c;全球 78% 的学术论文因写作问题被拒稿&#xff0c;其中结构性缺陷和学术规范失误占比超 80%。作为深…

作者头像 李华