java泛型之桥方法
来源:互联网 发布:三文鱼部位图解知乎 编辑:程序博客网 时间:2024/05/17 15:37
感觉泛型中的桥方法挺难理解的,写篇笔记记录一下(具体是core java第536页,我的理解可能会有偏差)。
如下面的两段代码:
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; }
}
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);
由于java语言的多态性,pair理论上应该调用DateInterval.setSecond方法。但是根据上面的分析,DateInterval类存在两个setSecond方法,到底该如何调用呢?
JVM工作原理如下:
1. 变量pair声明为Pair<Date>,该类型只有一个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<Date> {
public
Date getSecond() {
return
(Date)
super
.getSecond().clone();
}
}
擦除类型后,DateInterval有两个getSecond方法:
Date getSecond() //自身创建
Object getSecond() //继承自Pair<Date>
咦,方法的签名不是“方法名+参数”吗?为什么会存在签名一样,返回类型不一样的方法呢?实际上,在JVM中,返回类型是可以用来区分方法的,虚拟机能够正确处理这一情况。
如果对你有帮助,可以点击“推荐”哦`(*∩_∩*)′
本文转载于:
java泛型之桥方法 - momooy - 博客园
- java泛型之桥方法
- java中的泛型之桥方法(bridge method)
- java泛型之泛型方法。
- Java泛型之泛型方法
- Java笔记之泛型方法
- java核心技术卷 之泛型方法
- java 之 静态泛型方法
- Java 5.0 泛型之 Java泛型方法
- java泛型之二——方法泛型
- 学习:Java泛型之二(泛型方法)
- java里程碑之泛型--泛型方法
- java泛型程序设计之泛型方法
- effective java(27) 之优先考虑泛型方法
- java集合 之泛型 删除方法 排序 复合嵌套
- java继承之方法
- Java之本地方法
- java之构造方法
- Java之本地方法
- 04_Qt的画笔、作画和自定义控件
- 76. Minimum Window Substring 10-line template that can solve most 'substring' problems
- <java EE 项目:petstore> 从一个简单项目看 java web 如何在本jsp页面上对用户输入的格式进行限制与验证
- CANopen 块传输通信详解
- JAVA WEB -事务处理
- java泛型之桥方法
- 关于Fragment的一些使用心得-跳转和返回栈实战浅析
- iOS 表格数据刷新
- 生活在智慧龙岗的居民究竟有多幸福?
- SpringMVC+Spring+Mybatis整合配置
- SSD 之OP预留空间
- elasticsearch windows下安装
- iOS 探讨之 动态行为 UIDynamicItem
- JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class