Class<T>和 Class<?>類型 有什么區(qū)別
平時(shí)看java源代碼的時(shí)候锚赤,如果碰到了泛型,像 ?萌朱、T 宴树、K 、V晶疼、 E 這些是經(jīng)常出現(xiàn)的酒贬,但是不知道代表什么意思,今天特地整理下:
- 翠霍? 表示不確定的java類型锭吨。
- T 表示java類型。
- K V 分別代表java鍵值中的Key Value寒匙。
- E 代表Element零如。
Object和泛型通配符區(qū)別?
Object是所有類的根類,是具體的一個(gè)類锄弱,使用的時(shí)候可能需要類型強(qiáng)制轉(zhuǎn)換的考蕾,但是用通配符 ?、T 会宪、K 肖卧、V、 E 等這些的話掸鹅,在實(shí)際用之前類型就已經(jīng)確定了塞帐,不需要強(qiáng)制轉(zhuǎn)換。
追問(wèn):
也就是說(shuō)巍沙,這個(gè)方法能知道返回的是哪種類型(父類)葵姥,就用T行了?如果完全不知道的就用句携?用T的得到的對(duì)象就不需要類型轉(zhuǎn)換了榔幸,而用?的就必需用強(qiáng)轉(zhuǎn)了矮嫉!追答:
第一種是固定的一種泛型牡辽,第二種是只要是Object類的子類都可以,換言之敞临,任何類都可以态辛,因?yàn)镺bject是>所有類的根基類,固定的泛型指類型是固定的挺尿,比如:Interge,String就是<T extends Collection><奏黑? extends Collection> 這里炊邦?代表一個(gè)未知的類型,
但是熟史,這個(gè)未知的類型實(shí)際上是Collection的一個(gè)子類馁害,Collection是這個(gè)通配符的上限。
舉個(gè)例子:
class Test <T extends Collection> { }
<T extends Collection>其中,限定了構(gòu)造此類實(shí)例的時(shí)候T是一個(gè)確定類型(具體類型)蹂匹,這個(gè)類型實(shí)現(xiàn)了Collection接口碘菜,但是實(shí)現(xiàn) Collection接口的類很多很多,如果針對(duì)每一種都要寫(xiě)出具體的子類類型限寞,那也太麻煩了忍啸,干脆還不如用Object通用一下。<? extends Collection>其中,?是一個(gè)未知類型,是一個(gè)通配符泛型,這個(gè)類型是實(shí)現(xiàn)Collection接口即可履植。
_________________________上面講的是什么鬼计雌,當(dāng)你知道引入通配符泛型的由來(lái)之后
當(dāng)引入泛型之后,遇到這種情況玫霎,參數(shù)怎么寫(xiě)都不適合凿滤,總有2個(gè)方法不適用,為了給泛型類寫(xiě)一個(gè)通用的方法庶近,這時(shí)候就需要引入了 翁脆?通配符的概念。
public class Demo <T extends Animal>{
private T ob;
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
public Demo(T ob) {
super();
this.ob = ob;
}
public void print(){
System.out.println("T的類型是:"+ob.getClass().getName());
}
}