Java泛型詳解(下)

2021-08-04 03:00:19 字數 2099 閱讀 2607

假設現在有乙個類employee和它的子類manager

現在問題來了:

pair是pair的子類嗎?

答案是:不是

例如,下面的**將不會編譯成功:

manager tophonchos = ...;

pairresult = arrayalg.minmax(tophonchos); //error

//minmax方法返回pair, 而不是pair, 這樣的賦值是不合法的

也就是說,無論 s 與 t 有什麼聯絡,通常,pair與pair沒有什麼聯絡

也可以這麼理解,無論賦給型別變數的型別之間有什麼聯絡,在泛型類裡,這些關係都不存在了

另外,泛型類可以擴充套件或實現其他的泛型類,例如:arraylist類實現了list介面,這意味著,乙個arraylist可以被轉換為乙個list。但是,乙個arraylist不是乙個arraylist或list

假設我們現在需要列印一對員工的方法:

public

static

void

printbuddies(pairp)

現在問題來了,manager雖然不同於普通員工,但他也算是員工,他是員工的子類,但是根據之前說的泛型類繼承規則,pair與pair沒有任何關係,所以這個方法就不能接受pair類了,難道manager與普通員工就不能做朋友了嗎?不,為了解決這個問題,我們使用萬用字元型別

public

static

void

printbuddies(pair<? extends employee> p)

型別pair是pair<? extends employee>的子型別

可以認為,萬用字元為泛型類之間新增了一層聯絡,然而這種聯絡並不純粹,我們來看乙個例子:

pair

managerbuddies =

newpair

<>(ceo, cfo); //jdk7之後可以省略建構函式的型別變數,由編譯器根據語句自己翻譯

pair

<? extends employee> wildcbuddies; //ok

wildcardbuddies.setfirst(lowlyemployee); //這步就會報錯,compile-time error

究其原因,我們來看對於型別pair<? extends employee>內部對 setfirst 和 getfirst 方法的呼叫,它是這樣的:

? extends employee getfirst() //將getfirst返回值賦給乙個employee的引用完全合法

void setfirst(? extends employee) //出現型別錯誤,因為編譯器只知道需要某個employee的子型別,但不知道具體是什麼型別

萬用字元還有乙個比較強的功能就是可以指定乙個超類,像這樣:

? super manager //super關鍵字限制萬用字元為manager的所有超類(父類)
這樣的做法與之前的子型別限定恰好相反。這樣可以為方法提供引數(setfirst),但不能使用返回值(getfirst)

void setfirst(? super manager)

? super manager getfirst()

直觀的講,帶有超型別限定的萬用字元可以向泛型物件寫入,帶有子型別限定的萬用字元可以從泛型物件讀取

還可以使用無限定萬用字元,例如,pair<?>,初看起來,這好像與原始的pair型別一樣,實際上卻有很大的不同,型別pair<?>有以下的方法:

? getfirst()

void setfirst(?)

getfisrt的返回值只能賦給乙個object。setfirst方法不能被呼叫,甚至不能用object呼叫。pair<?>和pair的本質不同在於:可以用任意object物件呼叫原始pair類的setobject方法

Java 泛型詳解

普通泛型 public class point public void setvar t var public string tostring public class notepad public v getvalue public void setkey k key public void se...

Java 泛型詳解

表示集合中 儲存的資料型別 實現 泛型類 泛型類 泛型類 宣告時 尖括號中的字母 可以隨便定義 泛型類的型別在 初始化這個類的物件的時候確定 public class worker public void setm m m public void work public void sayhi m m...

java泛型介面詳解

泛型介面 inte ce tool 這種方式適合實現介面的時候就知道類裡的泛型是什麼 class toolimpl implements tool override public void print e e 這種方式不好!class tool2impl implements tool overri...