假設現在有乙個類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...