更新時(shí)間:2020-08-04 16:38:23 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2348次
泛型接口和類
泛型類和接口上面已經(jīng)演示過了,定義方式類似class A;這樣。需要注意一點(diǎn),在實(shí)現(xiàn)泛型接口時(shí)可以選擇傳入泛型實(shí)參或者不傳實(shí)參,傳入實(shí)參時(shí)實(shí)現(xiàn)類不需要聲明為泛型,實(shí)現(xiàn)類中所有使用泛型的地方都要轉(zhuǎn)為實(shí)參。不傳入實(shí)參時(shí),實(shí)現(xiàn)類也要聲明為泛型。
泛型方法
泛型方法能夠使方法獨(dú)立與類而產(chǎn)生變化,Java編程思想一書中有一個(gè)指導(dǎo)原則,無(wú)論何時(shí),只要能做到,就應(yīng)該盡量使用泛型方法。也就是說,如果使用泛型方法可以取代將整個(gè)類泛型化,那么就應(yīng)該只使用泛型方法。另外,對(duì)于一個(gè)static的方法而言,無(wú)法訪問泛型類的類型參數(shù),所以,如果static方法需要使用泛型能力,就必須使其成為泛型方法。
看一個(gè)簡(jiǎn)單例子:
首先上面這個(gè)類是普通類,并不是一個(gè)泛型類。這個(gè)類有一個(gè)泛型方法,這個(gè)方法可以靜態(tài)的也可以是靜態(tài)的,我這里選擇用靜態(tài)方法。方法get很簡(jiǎn)單,就是打印出參數(shù)的類型。在定義方法的時(shí)候,并不知道要傳入的方法類型,只有在編譯時(shí)期根據(jù)傳入的參數(shù)類型,可以推斷出泛型的實(shí)參,例如傳入的1,編譯器可以推斷出泛型參數(shù)類型為Integer,傳入“1”,編譯器可以推斷出泛型參數(shù)類型為String,傳入1.0編譯器可以推斷出泛型參數(shù)類型為Double。這個(gè)叫做參數(shù)類型推斷。
看下上面代碼執(zhí)行結(jié)果:
代碼的執(zhí)行結(jié)果證明了泛型方法不需要顯式的指明參數(shù)類型,可以推斷參數(shù)類型。類型推斷只對(duì)賦值操作有效,其他時(shí)候并不起作用。如果你將一個(gè)泛型方法調(diào)用的結(jié)果(例如New.map())作為參數(shù),傳遞給另一個(gè)方法,這時(shí)編譯器并不會(huì)執(zhí)行類型推斷。
綜上所述,當(dāng)使用泛型類時(shí)候,必須在創(chuàng)建對(duì)象的時(shí)候指定類型的參數(shù)值,而使用泛型方法的時(shí)候,通常不必指明參數(shù)類型,因?yàn)榫幾g器會(huì)找出具體的類型。
通配符
在定義泛型過程中會(huì)經(jīng)常遇到不同的通配符,例如T,E,K,V,?等,這些其實(shí)沒什么區(qū)別,但是默認(rèn)情況下有一些約定:
T表示一個(gè)java類型。
E表示元素Element,表示容器中的元素。
K V(key Value)分別代表java鍵值中的Key Value。
?表示不確定的java類型。
通配符一般可以分為無(wú)界通配符,上界通配符和下界通配符。
定義方式如下:
但是上界通配符和下屆通配符是具有局限性的。在上圖的list中,上界通配符定義的list只能get數(shù)據(jù),且類型為Fruit,add的時(shí)候會(huì)報(bào)錯(cuò)。下界通配符定義的list只能add數(shù)據(jù),get數(shù)據(jù)返回的只能是object,詳細(xì)信息會(huì)全部丟失。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java泛型有哪些?怎么用?”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743