Java-Java里的桥方法
首先来个具体点的问题:
public class Pair<T>
{
public Pair(){first=null;second=null;}
public Pair(T first,T second){this.first=first;this.second=second;}
public T getFirst(){return first;}
public T getSecond(){return second;}
public void setFirst(T newValue){first=newValue;}
public void setSecond(T newValue){second=newValue;}
private T first;
private T second;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
单从java代码很难理解, 上了字节码就容易多了.
若子类的代码为:
class DateInterval extends Pair<Date> {
public void setSecond(Date second) {
if (second.compareTo(getFirst()) >= 0)
super.setSecond(second);
}
static private void justTest(){
DateInterval interval=new DateInterval();
Pair<Date> pair=interval;
pair.setSecond(new Date());
}
}
编译后字节码为(省略无关部分):
class DateInterval extends Pair {
...
public void setSecond(java.util.Date second);
...
private static void justTest();
0 new DateInterval [1]
3 dup
4 invokespecial DateInterval() [33]
7 astore_0 [interval]
8 aload_0 [interval]
9 astore_1 [pair]
10 aload_1 [pair]
11 new java.util.Date [20]
14 dup
15 invokespecial java.util.Date() [34]
18 invokevirtual Pair.setSecond(java.lang.Object) : void [26]
21 return
public bridge synthetic void setSecond(java.lang.Object arg0);
0 aload_0 [this]
1 aload_1 [arg0]
2 checkcast java.util.Date [20]
5 invokevirtual DateInterval.setSecond(java.util.Date) : void [40]
8 return
}
首先会发现多了一个方法, synthetic表示这是编译器另外添加的方法:
public bridge synthetic void setSecond(java.lang.Object arg0)
这个方法真正覆盖了父类里的setSecond()方法. 然后在这个方法里, 首先把参数中的Object arg0转为Date型, 然后调用setSecond(Date)方法.
基本是做了一个桥接.
问题一:该子类 的setSecond(Date)方法与父类的setSecond(Object)方法是何关系?
---overload
问题二:
---调用了子类的桥方法setSecond(Object), 桥街到子类的setSecond(Date)方法;
问题三:pair实际的方法列表里的setSecond方法的参数是什么
---Object
更新
把评论里有用的部分贴上来:
3. 桥接的意义
-- justTest方法里最后,
18 invokevirtual Pair.setSecond(java.lang.Object) : void [26]
invokeVirtual在jvm spec7里这么说, 根据对象类型在 对象类里找setSecond(Object)方法; 找不到递归在父类中找. 如果没有桥方法, 那么子类里没有setSecond(Object), 最终调用的就是父类里的setSecond(Object)了. 这样就不是我们要的多态效果了.