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)換。
追問:
也就是說,這個(gè)方法能知道返回的是哪種類型(父類),就用T行了?如果完全不知道的就用?用T的得到的對象就不需要類型轉(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接口的類很多很多,如果針對每一種都要寫出具體的子類類型,那也太麻煩了,干脆還不如用Object通用一下。<? extends Collection>其中,?是一個(gè)未知類型,是一個(gè)通配符泛型,這個(gè)類型是實(shí)現(xiàn)Collection接口即可。
_________________________上面講的是什么鬼,當(dāng)你知道引入通配符泛型的由來之后
當(dāng)引入泛型之后,遇到這種情況,參數(shù)怎么寫都不適合,總有2個(gè)方法不適用,為了給泛型類寫一個(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());
}
}