有这个泛型类
这样我们就可以构成任何一对数并且随意设置与取出。
所以我可以这样设计另一个继承Pair<LocalDate>的类:
我们都知道虚拟机中只有普通类,也就是说通过类型擦除将得出虚拟机中存储的类,也就是——
于是,在DateInterval类中使用超类Pair的setSecond方法的参数类型很显然是Object类而不是LocalDate类。
这一冲突如何解决呢?就是今天的主角——桥方法
编译器会在DateInterval类中生成一个方法
假设我们有如下代码
调用的会是谁的方法呢??
首先可以肯定的是interval的setSecond方法。
调用我们自己写的会发生类型冲突。
那就是编译器添加的桥方法了。
这两个方法void setSecond(Object) 和 void setSecond(LocalDate),由于方法签名(名称、参数列表)不同,写在一个类里没问题。然而,如果DateInterval类也重写了getSecond方法。。。
这个加了桥方法的情况又是如何呢?
很显然是:
Object getSecond()和 LocalDate getSecond()
这个的方法签名是一样的。但是虚拟机会由参数类型和返回类型共同指定一个方法。编译器会为两个仅仅返回类型不同的方法生成字节码,虚拟机会正确处理这种情况。
在重写方法是桥方法也出现过
一个方法重写另一个方法时,可以有更加“严格”的返回类型。
也是用了桥方法实现