Java-Java里的桥方法

发布于 2016-10-13 08:50:50 字数 484 浏览 1185 评论 1

首先来个具体点的问题:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灵芸 2017-04-28 01:52:37

单从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)了. 这样就不是我们要的多态效果了.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文