Java中關(guān)于泛型接口的使用說(shuō)明
什么是泛型接口
泛型接口是在接口類(lèi)中有一個(gè)未知對(duì)象,一個(gè)可變的對(duì)象。
從Java 5開(kāi)始,引入了參數(shù)化類(lèi)型(Parameterized Type)的概念,改造了所有的Java集合,使之都實(shí)現(xiàn)泛型,允許程序在創(chuàng)建集合時(shí)就可以指定集合元素的類(lèi)型,比如List就表名這是一個(gè)只能存放String類(lèi)型的List;
泛型(Generic):就是指參數(shù)化類(lèi)型,上面的List就是參數(shù)化類(lèi)型,因此就是泛型,而String就是該List泛型的類(lèi)型參數(shù);
泛型的好處
- 使集合可以記住元素類(lèi)型,即取出元素的時(shí)候無(wú)需進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)化了,可以直接用原類(lèi)型的引用接收;
- 一旦指定了性參數(shù)那么集合中元素的類(lèi)型就確定了,不能添加其他類(lèi)型的元素,否則會(huì)直接編譯保存,這就可以避免了“不小心放入其他類(lèi)型元素”的可能;
- 上述保證了如果在編譯時(shí)沒(méi)有發(fā)出警告,則在運(yùn)行時(shí)就一定不會(huì)產(chǎn)生類(lèi)型轉(zhuǎn)化異常(ClassCastException);
- 顯然,泛型使編程更加通用,并且代碼也更加簡(jiǎn)潔,代碼更加容易維護(hù);
定義泛型類(lèi)、接口
不僅Java的集合都定義成了泛型,用戶(hù)自己也可以定義任意泛型的類(lèi)、接口,只要在定義它們時(shí)用<>來(lái)指定類(lèi)型參數(shù)即可;
例如:
public interface SqlInterFace<T> { ... }其中指定了該泛型的類(lèi)型參數(shù),這個(gè)T是一個(gè)類(lèi)型參數(shù)名,用戶(hù)可以任意命名(就像方法參數(shù)的形參名一樣),只有在定義該泛型的對(duì)象時(shí)將T替換成指定的具體類(lèi)型從而產(chǎn)生一個(gè)實(shí)例化的泛型對(duì)象,一個(gè)泛型接口可以被多個(gè)類(lèi)實(shí)現(xiàn),可以減少接口的開(kāi)發(fā)。
例如:
SqlInterFace<BondCode> interFace = new BondCodeService(); SqlInterFace<BondDeal> dealSqlInterFace = new BondDealService(); SqlInterFace<BondDealRecord> bondCodeService = new BondDealRecordService();
實(shí)現(xiàn)/繼承泛型接口/泛型類(lèi)
定義泛型和使用泛型的概念:主要區(qū)別就是定義和使用
- 那Java的方法做類(lèi)比,Java的方法在定義的時(shí)候使用的都是形參(虛擬參數(shù)),但是在調(diào)用方法(使用方法)的時(shí)候必須傳入實(shí)參;
- 同樣泛型也有這個(gè)特點(diǎn),泛型的類(lèi)型參數(shù)和方法的參數(shù)一樣,也是一種參數(shù),只不過(guò)是一種特殊的參數(shù),用來(lái)表示未知的類(lèi)型罷了;
- 因此,泛型也是在定義的時(shí)候必須使用形參(虛擬參數(shù),用戶(hù)自己隨意命名),但是在使用泛型的時(shí)候(比如定義泛型引用、繼承泛型)就必須使用實(shí)參,而泛型的實(shí)參就是具體的類(lèi)型,像String、Integer等具體的類(lèi)型(當(dāng)然也可以是自定義類(lèi)型);
- 泛型定義的時(shí)候使用形參,例如:public class MyGeneric { … } // T就是一個(gè)自己隨意命名的類(lèi)型形參
- 使用泛型的時(shí)候必須傳入實(shí)參:
- 定義引用(對(duì)象)的時(shí)候毫無(wú)疑問(wèn),肯定需要傳實(shí)參:ArrayList list = …; // 必須用具體的類(lèi)型,像這里就是String來(lái)代替形參,即實(shí)參
實(shí)現(xiàn)/繼承一個(gè)泛型接口/類(lèi)的時(shí)候
- 你在實(shí)現(xiàn)/繼承一個(gè)接口/類(lèi)的時(shí)候?qū)嶋H上是在使用該接口/類(lèi),比如:public class Son extends Father { … }中Father這個(gè)類(lèi)就是正在被使用,毫無(wú)疑問(wèn),必定是在使用;
- 因此泛型其實(shí)無(wú)法繼承/實(shí)現(xiàn),因?yàn)樵趯?shí)現(xiàn)/繼承的時(shí)候必須為泛型傳入類(lèi)型實(shí)參,給定實(shí)參后它就是一個(gè)具體的類(lèi)型了,就不再是泛型了
示例:
public class MyType extends MyGeneric { … } // implements、extends的時(shí)候必須傳入類(lèi)型實(shí)參,因?yàn)閷?shí)在使用泛型??!原則上,任何編程語(yǔ)言都不允許泛型模板層層繼承??!
繼承之后,父類(lèi)/接口中的所有方法中的類(lèi)型參數(shù)都將變成具體的類(lèi)型,你在子類(lèi)中覆蓋這些方法的時(shí)候一定要用具體的類(lèi)型,不能繼續(xù)使用泛型的類(lèi)型形參了
泛型參數(shù)繼承
- 上面派生出來(lái)的類(lèi)不是泛型,是一個(gè)實(shí)體類(lèi)型,因?yàn)槠淅^承的泛型是具有類(lèi)型實(shí)參的,而Java還支持一種特殊的語(yǔ)法,可以讓你從泛型繼續(xù)派生出泛型,而泛型的類(lèi)型參數(shù)可以繼續(xù)傳承下去;
- 語(yǔ)法如下:
class Father<T> { ... }class Son<T> extends Father<T> { ... }- 即子泛型可以傳承父泛型的泛型參數(shù),那么在子類(lèi)中泛型參數(shù)T就和父類(lèi)的完全相同,還是照常使用(和父類(lèi)一樣正常使用);
注意:
這里extends Father了,因此父類(lèi)泛型Father就是被使用了,而按照之前講的規(guī)則,使用給一個(gè)泛型是必須要指定類(lèi)型實(shí)參的!
因此這里的這個(gè)語(yǔ)法是一種特殊語(yǔ)法,Java專(zhuān)門(mén)為這種語(yǔ)法開(kāi)了后門(mén),這種語(yǔ)法只有在類(lèi)型參數(shù)傳承的時(shí)候才會(huì)用到(即上面這種應(yīng)用);
一旦使用了這種語(yǔ)法,就表示要進(jìn)行類(lèi)型參數(shù)的傳承了(即父類(lèi)的T傳遞給子類(lèi)繼續(xù)使用,因此子類(lèi)也是一個(gè)跟父類(lèi)一樣的泛型);
并且一旦使用了這種語(yǔ)法,那么子類(lèi)定義中的Son和extends Father中的類(lèi)型參數(shù)必須和定義父類(lèi)時(shí)的類(lèi)型參數(shù)名完全一樣??!
以下三種情況全部錯(cuò)誤(全部發(fā)生編譯報(bào)錯(cuò)):
class Father<T> { }
class Son<E> extends Father<T> { }
class Father<T> { }
class Son<T> extends Father<E> { }
class Father<T> { }
class Son<E> extends Father<E> { }必須全部使用和父類(lèi)定義相同的類(lèi)型參數(shù)名(T)!
才行,這是Java語(yǔ)法的特殊規(guī)定;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用not運(yùn)算符對(duì)布爾值取反的方法
本文詳細(xì)介紹了Python中布爾值的取反操作,包括基本用法、非布爾值的取反、實(shí)際場(chǎng)景示例、注意事項(xiàng)以及自定義對(duì)象的布爾轉(zhuǎn)換,通過(guò)not運(yùn)算符,可以高效地進(jìn)行邏輯反轉(zhuǎn),需要的朋友可以參考下2026-02-02
淺談Python 字符串格式化輸出(format/printf)
下面小編就為大家?guī)?lái)一篇淺談Python 字符串格式化輸出(format/printf)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
用Python獲取智慧校園每日課表并自動(dòng)發(fā)送至郵箱
很多小伙伴們都在為查看智慧校園課表而煩惱,今天特地整理了這篇文章,不僅可以用Python獲取智慧校園每日課表,還會(huì)自動(dòng)發(fā)至你郵箱,需要的朋友可以參考下2021-05-05
pandas把所有大于0的數(shù)設(shè)置為1的方法
今天小編就為大家分享一篇pandas把所有大于0的數(shù)設(shè)置為1的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python疊加兩幅柵格圖像的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Python疊加兩幅柵格圖像的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python中將JSON數(shù)據(jù)寫(xiě)入文件的實(shí)現(xiàn)方法
在Python開(kāi)發(fā)中,JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于前后端數(shù)據(jù)交互、配置文件存儲(chǔ)等場(chǎng)景,當(dāng)我們需要將Python中的字典或列表等數(shù)據(jù)以JSON格式保存到文件時(shí),就需要掌握如何將JSON數(shù)據(jù)寫(xiě)入文件的方法,所以本文給大家介紹了Python中將JSON數(shù)據(jù)寫(xiě)入文件的實(shí)現(xiàn)方法2025-06-06
Python中選擇排序的實(shí)現(xiàn)與優(yōu)化
選擇排序(Selection?Sort)是一種簡(jiǎn)單但有效的排序算法,本文將詳細(xì)介紹選擇排序算法的原理和實(shí)現(xiàn),并提供相關(guān)的Python代碼示例,需要的可以參考一下2023-06-06

