news 2026/4/18 11:52:31

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/4/18 7:53:47

基于AI智能名片链动2+1模式S2B2C商城小程序的流量运营策略研究

摘要&#xff1a;在零售行业竞争日益激烈的背景下&#xff0c;流量获取与转化成为企业发展的关键。本文聚焦AI智能名片链动21模式S2B2C商城小程序这一创新商业模式&#xff0c;深入探讨其在推广产品定位、归集渠道现有流量以及拓展内外部流量方面的作用机制与实践路径。通过理论…

作者头像 李华
网站建设 2026/4/18 8:08:50

8个降AI率工具推荐!自考党速看

8个降AI率工具推荐&#xff01;自考党速看 AI降重工具&#xff1a;自考论文的“隐形助手” 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的自考学生发现自己的论文中出现了明显的AI痕迹&#xff0c;导致AIGC率过高&#xff0c;影响了最终成绩。为了应对这一挑战…

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

Python+vue3+django的社区桶装饮用水预购管理系统的设计与实现

目录社区桶装饮用水预购管理系统的设计与实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;社区桶装饮用水预购管理系统的设计与实现摘要 该系统基于PythonDjangoVue3技术栈开发&…

作者头像 李华
网站建设 2026/4/18 8:53:03

RAG增强与RAG系统技术报告

文章大纲 从架构设计到企业级实践 摘要 第1章 引言 1.1 传统RAG的核心痛点 1.2 PowerRAG的定位 第2章 PowerRAG增强型框架核心能力 2.1 核心技术亮点 2.2 落地效果提升 2.3 与OceanBase一体化融合 第3章 RAG系统全链路技术架构 3.1 两大核心支柱:文档解析 + 检索策略 3.2 嵌入…

作者头像 李华
网站建设 2026/4/18 5:38:38

基于YOLOv8的恶性疟原虫智能检测系统工程实践 [目标检测完整源码]

文章目录基于YOLOv8的恶性疟原虫智能检测系统工程实践 [目标检测完整源码]一、应用背景与问题定义源码下载与效果演示二、整体技术方案设计三、数据集构建与训练策略四、模型推理与系统部署五、工程实现亮点六、应用前景与拓展方向七、结语基于YOLOv8的恶性疟原虫智能检测系统工…

作者头像 李华
网站建设 2026/4/18 8:08:12

写论文软件哪个好?实测揭秘!宏智树 AI 凭 “真研究” 实力出圈

毕业季的论文焦虑&#xff0c;几乎是每一位学子的必经之路&#xff1a;选题太泛被导师打回、文献堆砌逻辑混乱、数据分析无从下手、查重率居高不下、AI 生成痕迹被系统标红…… 面对五花八门的论文写作工具&#xff0c;“写论文软件哪个好” 成了无数学子的灵魂拷问。 作为深耕…

作者头像 李华