java泛型之橋方法


感覺泛型中的橋方法挺難理解的,寫篇筆記記錄一下(具體是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中,返回類型是可以用來區分方法的,虛擬機能夠正確處理這一情況。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM