类型擦除与多态的冲突——桥方法

有这个泛型类

这样我们就可以构成任何一对数并且随意设置与取出。

所以我可以这样设计另一个继承Pair<LocalDate>的类:

我们都知道虚拟机中只有普通类,也就是说通过类型擦除将得出虚拟机中存储的类,也就是——

于是,在DateInterval类中使用超类Pair的setSecond方法的参数类型很显然是Object类而不是LocalDate类。

这一冲突如何解决呢?就是今天的主角——桥方法

编译器会在DateInterval类中生成一个方法

假设我们有如下代码

调用的会是谁的方法呢??

首先可以肯定的是interval的setSecond方法。

调用我们自己写的会发生类型冲突。

那就是编译器添加的桥方法了。


这两个方法void setSecond(Object) 和 void setSecond(LocalDate),由于方法签名(名称、参数列表)不同,写在一个类里没问题。然而,如果DateInterval类也重写了getSecond方法。。。

这个加了桥方法的情况又是如何呢?

很显然是:

Object getSecond()和 LocalDate getSecond()

这个的方法签名是一样的。但是虚拟机会由参数类型和返回类型共同指定一个方法。编译器会为两个仅仅返回类型不同的方法生成字节码,虚拟机会正确处理这种情况。


在重写方法是桥方法也出现过

一个方法重写另一个方法时,可以有更加“严格”的返回类型。

也是用了桥方法实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值