当前位置: 首页 > news >正文

Java泛型---桥方法

桥方法

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

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,它的方法类型擦除后是什么样子

 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特性。然而,这样看不见的特性,怎么去证明它确实存在?其一是,这样的桥方法是编译器自动生成,如果你手动编写这样的方法,会与编译器生成的产生冲突,从而报错。
image
其二是通过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泛型的转换,记住以下几点:

  • 虚拟机中没有泛型,只有普通的类和方法。
  • 所有类型参数都会替换为他们的限定类型。
  • 会合成桥方法来保持多态
  • 为保持类型安全性,必要时会强制插入类型转换。
http://www.jsqmd.com/news/263292/

相关文章:

  • C14-2025.1.18
  • C14-2025.1.18
  • AI论文写作效率飙升200%:从零到一9款工具实操指南,彻底告别拖延 - 麟书学长
  • 别忽视这个16×16的小图标:Icon背后的产品逻辑,以及一款让开发者省心的制作工具
  • 2026年国内专业的智能货架定制厂家推荐,钢制货架/悬臂货架/重载货架/不锈钢货架/模具架/货架,智能货架批发厂家选哪家 - 品牌推荐师
  • 小程序计算机毕设之基于springboot位置服务的城市路线分享系统小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序毕设项目:基于springboot位置服务的城市路线分享系统小程序(源码+文档,讲解、调试运行,定制等)
  • 计算机小程序毕设实战-基于springboot+微信小程序的校园导航与信息服务系统基于微信小程序的校园信息交流平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于小程序的位置服务的城市路线分享系统的设计与实现基于springboot位置服务的城市路线分享系统小程序【附源码、数据库、万字文档】
  • 基于AI智能名片链动2+1模式S2B2C商城小程序的流量运营策略研究
  • 学霸同款2026 AI论文网站TOP8:本科生毕业论文必备测评
  • 分期乐购物额度闲置?安全回收指南+可可收实操拆解 - 可可收
  • 全球口碑最好的防脱洗发水排名前十,洗发水哪个牌子效果好?青少年安全首选第一名 - 博客万
  • 大学院-筆記試験練習:数据库(データベース問題訓練) と 软件工程(ソフトウェア)(12)
  • 微信小程序毕设项目推荐-基于微信小程序的驾考在线学习与测试系统基于springboot+微信小程序的驾考在线学习与测试系统【附源码+文档,调试定制服务】
  • 【毕业设计】基于springboot位置服务的城市路线分享系统小程序(源码+文档+远程调试,全bao定制等)
  • Java String 字符串终极详解(全特性+全API+全示例)
  • 【人工智能学习-AI入试相关题目练习-第六次】
  • 微信小程序毕设项目推荐-基于SpringBoot+Vue的校园导航微信小程序的设计与实现基于springboot+微信小程序的校园导航与信息服务系统【附源码+文档,调试定制服务】
  • 氨糖软骨素那个牌子效果最好一 氨糖软骨素选购终极指南:2026高纯高浓新品测评全解析(附真实用户反馈+临床数据支撑) - 博客万
  • 小程序毕设选题推荐:基于位置服务的城市路线分享系统基于springboot位置服务的城市路线分享系统小程序【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 医学图像领域 顶刊顶会
  • 小程序计算机毕设之基于springboot+微信小程序的校园导航与信息服务系统基于Java的校园导航微信小程序的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 除甲醛哪个牌子产品好?2026年全网畅销的十大除醛品牌揭晓,第一款效果惊艳 - 博客万
  • 【计算机毕业设计案例】基于微信小程序驾校预约练车平台的设计与实现基于springboot+微信小程序的驾考在线学习与测试系统(程序+文档+讲解+定制)
  • 小程序计算机毕设之基于springboot+微信小程序的驾校在线学习考试小程序驾考在线学习与测试系统(完整前后端代码+说明文档+LW,调试定制等)
  • 2026年市面上专业的换热器供应商哪家好,高大空间空调机组/采暖机组/柜式空调机组/冷热水暖风机,换热器工厂推荐 - 品牌推荐师
  • 如何解决节日礼物选购难题?2026 小众高级感礼物top10深度测评 - 博客万
  • 小程序毕设项目:基于springboot+微信小程序的校园导航与信息服务系统(源码+文档,讲解、调试运行,定制等)
  • 【计算机毕业设计案例】基于SpringBoot+Vue校园导航微信小程序的设计与实现基于springboot+微信小程序的校园导航与信息服务系统(程序+文档+讲解+定制)