news 2026/4/3 5:51:42

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/3/26 19:33:33

自动化视频制作:深入解析 FFmpeg 图片转视频脚本

在处理大量生成的图片资产&#xff08;如 AI 生成的艺术图&#xff09;时&#xff0c;我们经常需要将它们转化为更易于分享的视频格式。手动操作不仅繁琐&#xff0c;而且难以保证每张图停留时间的精确性。本文将带你深入剖析一个自动化脚本&#xff0c;看看它是如何一键完成“…

作者头像 李华
网站建设 2026/3/29 11:47:43

小程序毕设选题推荐:基于Java的校园导航微信小程序的设计与实现基于springboot+微信小程序的校园导航与信息服务系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/3/25 13:14:45

实验六 入侵检测实验

一、实验目的入侵检测实验与理论教学第七章入侵检测相对应。本实验在学生完成入侵检测系统配置实验的基础上&#xff0c;使学生能够理解三种入侵检测系统的原理和分析方法&#xff0c;并能够建立一个入侵检测系统。具体如下&#xff1a;1、入侵检测系统配置实验&#xff1a;验证…

作者头像 李华
网站建设 2026/3/28 4:41:37

Python_django的初中英语学习训练与测评系统

目录初中英语学习训练与测评系统&#xff08;基于Python Django&#xff09;开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;初中英语学习训练与测评系统&#xff08;基于Python Django&…

作者头像 李华
网站建设 2026/3/30 1:36:36

告别课程论文 “凑字数”!宏智树 AI:让学术小白轻松写出高分范文

每到学期末&#xff0c;课程论文就成了大学生的 “甜蜜负担”—— 想认真写却苦于选题无方向&#xff0c;想东拼西凑又怕查重超标&#xff0c;好不容易写完还被导师批 “逻辑混乱、缺乏学术性”。作为深耕论文写作科普的教育博主&#xff0c;今天就给大家安利一款课程论文写作神…

作者头像 李华