2026/4/6 4:09:42
网站建设
项目流程
网站2级目录怎么做的,成都制作网站公司,wordpress扫码支付下载,网站开发签呈如何写桥方法
桥方法是为了解决类型擦除后与多态的冲突。为了理解什么是桥方法。下面举实例#xff0c;假设有一个泛型类Pair#xff0c;它用来保存两个值#xff0c;first与second#xff0c;first永远比second大。
现在#xff0c;创建一个子类去继承它。
/* by yours.tools -…桥方法桥方法是为了解决类型擦除后与多态的冲突。为了理解什么是桥方法。下面举实例假设有一个泛型类Pair它用来保存两个值first与secondfirst永远比second大。现在创建一个子类去继承它。/* by yours.tools - online tools website : yours.tools/zh/calcvolume.html */ package Test; import java.time.LocalDate; public class PairT { 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 PairLocalDate { 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(); //创建一个实例 PairLocalDate 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 PairLocalDate { //编译器自动生成桥方法 public LocalDate getSecond(){ //返回父类的second值并转为LocalDate类 return (LocalDate) super.getSecond(); } }编译器会生成下面的桥方法LocalDate getSecond(); Object getSecond();//父类继承总之对Java泛型的转换记住以下几点虚拟机中没有泛型只有普通的类和方法。所有类型参数都会替换为他们的限定类型。会合成桥方法来保持多态为保持类型安全性必要时会强制插入类型转换。