平時看java源代碼的時候,如果碰到泛型的話,我想? T K V E這些是經常出現的,但是有時想不起來代表什么意思,今天整理下:
? 表示不確定的java類型。
T 表示java類型。
K V 分別代表java鍵值中的Key Value。
E 代表Element。
Object跟這些東西代表的java類型有啥區別呢?
Object是所有類的根類,是具體的一個類,使用的時候可能是需要類型強制轉換的,但是用T ?等這些的話,在實際用之前類型就已經確定了,不需要強制轉換。
追問:
也就是說,這個方法能知道返回的是哪種類型(父類),就用T行了?如果完全不知道的就用?用T的得到的對象就不需要類型轉換了,而用?的就必需用強轉了!
追答:
第一種是固定的一種泛型,第二種是只要是Object類的子類都可以,換言之,任何類都可以,因為Object是所有類的根基類
固定的泛型指類型是固定的,比如:Interge,String. 就是<T extends Collection>
<? extends Collection> 這里?代表一個未知的類型,
但是,這個未知的類型實際上是Collection的一個子類,Collection是這個通配符的上限.
舉個例子
class Test <T extends Collection> { }
<T extends Collection>其中,限定了構造此類實例的時候T是一個確定類型(具體類型),這個類型實現了Collection接口,
但是實現 Collection接口的類很多很多,如果針對每一種都要寫出具體的子類類型,那也太麻煩了,干脆還不如用
Object通用一下。
<? extends Collection>其中,?是一個未知類型,是一個通配符泛型,這個類型是實現Collection接口即可。
_________________________上面講的是什么鬼,當你知道引入通配符泛型的由來之后(下面代碼由java1234.com提供)

The method take(Animal) in the type Test is not applicable for the arguments (Demo<Dog>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Cat>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Animal>)
當引入泛型之后,遇到這種情況,參數怎么寫都不適合,總有2個方法不適用,為了給泛型類寫一個通用的方法,這時候就需要引入了 ?通配符的概念。
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());
}
}

