java 泛型中的桥方法

bridge method :

这个方法存在的意义?或者这个方法用来解决什么问题呢?

解决泛型遇到多态,jvm使用桥方法解决。

举例,泛型遇到多态。

如下面的两段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Pair<T> {

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

}

1

2

3

class DateInterval extends Pair<Date> {

    public void setSecond(Date second) {}

}

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

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

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

考虑以下调用:

DateInterval interval = new DateInterval(...);

Pair<Date> pair = interval;

pair.setSecond(aDate);

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

jvm遇到 :

DateInterval interval = new DateInterval(...);

Pair<Date> pair = interval;

1.  正常思维是jvm最终调用 setSecond(Date) 这个方法,也就是 DateInterval 的方法。

2   实际上,jvm 会用 pair 引用的对象去调用这个setSecond(Object)方法。那 DateInterval 的方法呢?

3.  jvm通过 pair 的方法再间接调用 DateInterval  的方法(这就是jvm对泛型遇到多态的核心处理方式)

4.  pair的方法相当于 “桥梁的作用 ”,它的内容就是调用 DateInterval 的方法

public void setSecond(Object second) { setSecond((Date) second); }

这个方法叫做 桥方法。

另外呢,jvm可以通过返回类型 来区分多态方法。

猜你喜欢

转载自blog.csdn.net/qq_34561892/article/details/81335203