java桥_java泛型之桥方法

感觉泛型中的桥方法挺难理解的,写篇笔记记录一下(具体是core java第536页,我的理解可能会有偏差)。

如下面的两段代码:

public class Pair {

private T first;

private T second;

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; }

}

class DateInterval extends Pair {

public void setSecond(Date second) {}

}

由于类型擦除的原因,DateInterval存在两个setSecond方法,分别为:

public void setSecond(Date second)      //自身创建

public void setSecond(Object second)    //继承自Pair

考虑以下调用:

DateInterval interval = new DateInterval(...);

Pair pair = interval;

pair.setSecond(aDate);

由于java语言的多态性,pair理论上应该调用DateInterval.setSecond方法。但是根据上面的分析,DateInterval类存在两个setSecond方法,到底该如何调用呢?

JVM工作原理如下:

1.  变量pair声明为Pair,该类型只有一个setSecond(Object)方法,虚拟机用pair引用的对象去调用这个setSecond(Object)方法。

2.  pair引用的对象是DateInterval,所以将会调用DateInterval.setSecond(Object)方法,这个方法是桥方法。

3.  这个桥方法会调用DateInterval.setSecond(Date)方法。

桥方法代码:public void setSecond(Object second) { setSecond((Date) second); }      //仔细看方法内部的Date强制类型转换,使得桥方法调用了DateInterval.setSecond(Date)方法

桥方法有时候会变得十分奇怪,假设DateInterval方法也覆盖了getSecond方法:

class DateInterval extends Pair {

public Date getSecond() {

return (Date) super.getSecond().clone();

}

}

擦除类型后,DateInterval有两个getSecond方法:

Date getSecond()      //自身创建

Object getSecond()   //继承自Pair

咦,方法的签名不是“方法名+参数”吗?为什么会存在签名一样,返回类型不一样的方法呢?实际上,在JVM中,返回类型是可以用来区分方法的,虚拟机能够正确处理这一情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值