平時(shí)看java源代碼的時(shí)候,如果碰到泛型的話锐峭,我想? T K V E這些是經(jīng)常出現(xiàn)的,但是有時(shí)想不起來(lái)代表什么意思可婶,今天整理下:
沿癞? 表示不確定的java類型。
T? 表示java類型矛渴。
K V 分別代表java鍵值中的KeyValue椎扬。
E 代表Element。
Object跟這些東西代表的java類型有啥區(qū)別呢具温?
Object是所有類的根類蚕涤,是具體的一個(gè)類,使用的時(shí)候可能是需要類型強(qiáng)制轉(zhuǎn)換的铣猩,但是用T 揖铜?等這些的話,在實(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. 就是
<? extends Collection> 這里钟病?代表一個(gè)未知的類型萧恕,
但是,這個(gè)未知的類型實(shí)際上是Collection的一個(gè)子類肠阱,Collection是這個(gè)通配符的上限.
舉個(gè)例子
class Test { }
其中,限定了構(gòu)造此類實(shí)例的時(shí)候T是一個(gè)確定類型(具體類型)票唆,這個(gè)類型實(shí)現(xiàn)了Collection接口,
但是實(shí)現(xiàn) Collection接口的類很多很多屹徘,如果針對(duì)每一種都要寫(xiě)出具體的子類類型走趋,那也太麻煩了,干脆還不如用
Object通用一下噪伊。
其中,?是一個(gè)未知類型,是一個(gè)通配符泛型,這個(gè)類型是實(shí)現(xiàn)Collection接口即可簿煌。
_________________________上面講的是什么鬼氮唯,當(dāng)你知道引入通配符泛型的由來(lái)之后(下面代碼由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ù)怎么寫(xiě)都不適合惩琉,總有2個(gè)方法不適用,為了給泛型類寫(xiě)一個(gè)通用的方法夺荒,這時(shí)候就需要引入了 瞒渠?通配符的概念。
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());
}
}