首先定義乙個類:
class user
public user(t t1, t t2)
public t gett1()
public void sett1(t t1)
public t gett2()
public void sett2(t t2)
}
有乙個add()方法,引數型別為user:
public static int add(useruser)
user類可以簡化看作三種元素構成:t t
、t get()
、set(t t)
。
使用了extends萬用字元後,上述user
類可以簡化地理解為:
class user<? extends number>
public void sett1(<? extends number> t1)
}
現在分別嘗試呼叫get()
、set()
方法。
public static int add(user<? extends number> user)
結果:get()
方法沒有問題,set()
方法編譯無法通過。
原因:
j**a泛型擦拭機制:編譯器總是將轉為object
,並且在需要轉型的時候,編譯器會根據t
的型別自動為我們實行安全地強制轉型。
extends萬用字元user<? extends number>
可以接收integer
、double
和bigdecimal
等number
的子型別。
super萬用字元和extends萬用字元剛好相反。user<? super integer>
可以接收number
、object
等父型別。
同樣user類可以簡化看作三種元素構成:t t
、t get()
、set(t t)
。
使用了extends萬用字元後,上述user
類可以簡化地理解為:
class user<? super integer>
public void sett1(<? super integer> t1)
}
同樣是呼叫get()
和set()
:
public static int test(user<? super integer> user)
結果:set()
方法沒有問題,get()
方法編譯無法通過。
原因:
無論是<? extends number>
還是<? super integer>
都可以理解為就是某一種型別。
上兩節描述的兩種情況,其實背後都是因為j**a泛型的擦拭機制導致的,同時這種j**a泛型的擦拭機制的制定是因為j**a需要先編譯後執行的靜態語言特性,為了讓編譯器能在早期來幫助靜態校正程式和提前找到錯誤,必須犧牲一定的靈活性——編譯器無法準確判斷泛型型別,從而實現安全轉型的都報錯誤。
泛型中extends和super的區別詳解
首先來說 extends t 叫 上界萬用字元 super t 叫 下界萬用字元 1.下面用 來說明上界萬用字元的一些特點 public class fruit public class apple extends fruit public class banana extends fruit pu...
Java泛型萬用字元extends與super
static class food static class fruit extends food complie error flist.add new fruit flist.add new object flist.add null only work for nullfruit fruit ...
Java泛型萬用字元extends與super
static class food static class fruit extends food complie error flist.add new fruit flist.add new object flist.add null only work for nullfruit fruit ...