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

The method take(Animal) in the type Test is not applicable for the arguments (Demo)
The method take(Animal) in the type Test is not applicable for the arguments (Demo)
The method take(Animal) in the type Test is not applicable for the arguments (Demo)

當(dāng)引入泛型之后,遇到這種情況,參數(shù)怎么寫都不適合,總有2個方法不適用,為了給泛型類寫一個通用的方法,這時候就需要引入了 ?通配符的概念。


publicclassDemo {privateT ob;publicT getOb() {returnob;
}publicvoidsetOb(T ob) {this.ob =ob;
}publicDemo(T ob) {super();this.ob =ob;
}publicvoidprint(){
System.out.println("T的類型是:"+ob.getClass().getName());
}
}