摘要:參數(shù)化的類型其中是參數(shù)化的類型。類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)其中是類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)。它們并沒(méi)有重載,而且泛型中也不存在重載這一說(shuō)法。除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對(duì)整個(gè)類的泛化,因?yàn)榉盒头椒ǜ菀装咽虑檎f(shuō)明白。
泛型是適用于許多許多的類型 ---《JAVA編程思想》
在Java的面向?qū)ο缶幊踢^(guò)程中, 或許你知道運(yùn)用繼承、接口等一系列面向?qū)ο蟮膭?dòng)作來(lái)實(shí)現(xiàn)代碼復(fù)用,解耦等目的。 但是你知道的,原始類的繼承是單繼承,而接口更是把類型協(xié)議寫死了。我們的代碼能否不要這么死板(當(dāng)然你可以認(rèn)為那是完美的), 我們的代碼能否適用于更多的不具體的類型?代碼更加通用?甚至這個(gè)類型你自己都不知道?,沒(méi)錯(cuò),在JDK1.5中,JAVA引入了一個(gè)新的代碼泛化機(jī)制---泛型。
你必須事先知道的一些術(shù)語(yǔ)
原始類型
List users=new ArrayList(); 其中List是原始類型。
參數(shù)化的類型
Listusers=new ArrayList<>(); 其中List 是參數(shù)化的類型。 即把原始類型參數(shù)化了。
泛型類型
Listusers=new ArrayList<>(); 其中List 是泛型類型。
類型變量或類型參數(shù)
Listusers=new ArrayList<>(); 其中 是類型變量或類型參數(shù)。 即一個(gè)指向某種類型的變量。 大家知道函數(shù)形成參,這里可以看做是"類型形參”。
類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)
List泛型也可以如此簡(jiǎn)單users=new ArrayList<>(); 其中 是類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)。 大家知道函數(shù)實(shí)參,這里可以看做是"類型實(shí)參”。
在JDK1.5版本以前,我們使用List集合get數(shù)據(jù)是需要轉(zhuǎn)型的,如下
List users=new ArrayList<>(); users.add("armstrong"); String user = (String) users.get(0);
上面代碼中,List集合是可以傳入任何Object及它的子類的。我們傳入一個(gè)String類型的數(shù)據(jù),取出來(lái)默認(rèn)是Object,所以你需要轉(zhuǎn)型。使用原始類型的弊端:在程序運(yùn)行起來(lái)的時(shí)候,可能會(huì)出現(xiàn)轉(zhuǎn)型失敗的異常。那么補(bǔ)救方法呢?
Jdk1.5里面是這樣定義List:
public interface Listextends Collection { int size(); boolean isEmpty(); T[] toArray(T[] a); boolean add(E e); ... }
你可以看到List類這個(gè)原始類型,定義成了接口List泛型類型。類、接口的泛型定義方式是一樣的,那么我們可以這樣編寫之前那段代碼:
ListusersGenertor=new ArrayList<>(); usersGenertor.add("armstrong"); String userS = usersGenertor.get(0);
而且,此時(shí)List
ListusersGenertor=new ArrayList<>(); usersGenertor.add(new Object());// error,此處不能添加Object類型 usersGenertor.add(123);// error,此處不能添加Integer類型 String userS = usersGenertor.get(0);
為了更好的解釋泛型的概念。打個(gè)比方,我們知道達(dá)爾文的《進(jìn)化論》中說(shuō)人和猴子的祖先都是猿。但是人只能生人 猴子只能生猴子,雖然有共同的祖先,但是人類不等于猴類 我們也不能說(shuō)人是猿。人不等于猿~ 那么List后面跟著一個(gè)類型變量T,就是指List只能持有指定類型的元素,如果T如果被String替代,那么List就只能持有String, 而List
List
有同學(xué)會(huì)說(shuō),這個(gè)例子太簡(jiǎn)單了,能不能來(lái)一些有難度的。 其實(shí),我舉這個(gè)例子的初衷是讓大家知道---JDK開發(fā)人員引入泛型直到現(xiàn)在最大的好處就是為了解決容器轉(zhuǎn)型的麻煩,而且平時(shí)工作中我們用泛型最多的場(chǎng)景是和容器打交道。
非常好用的泛型方法在定義List的接口源碼中我們可以看到如下方法:
T[] toArray(T[] a);
這個(gè)方法的作用是把List中的所有元素轉(zhuǎn)存到另一個(gè)指定類型的數(shù)組中。List原本裝什么類型的元素,那么數(shù)組也裝同樣類型的元素,并且這里傳入的類型和返回值類型一致都是類型變量T[]。
那么泛型方法是如何定義的呢? 在上面代碼中,我們在返回值的前面,用
ListusersGenertor=new ArrayList<>(); usersGenertor.add("zeng"); usersGenertor.add("armstrong"); String[] strings = usersGenertor.toArray(new String[10]); for (String string : strings) { System.out.println("string:_"+string); } List usersGenertor2=new ArrayList<>(); usersGenertor2.add(1); usersGenertor2.add(2); Integer[] ints = usersGenertor2.toArray(new Integer[3] ); for (Integer inta : ints) { System.out.println("Integer:_"+inta); } output: string:_zeng string:_armstrong string:_null string:_null string:_null string:_null string:_null string:_null string:_null string:_null Integer:_1 Integer:_2 Integer:_null
上面的代碼中toArray方法分別傳入了String和Integer兩種不同的引用類型。它們并沒(méi)有重載,而且泛型中也不存在重載這一說(shuō)法。暫時(shí)我們可以簡(jiǎn)單的想象成String,Integer在編譯期間把T這個(gè)類型參數(shù)變量替換掉了。
除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對(duì)整個(gè)類的泛化,因?yàn)榉盒头椒ǜ菀装咽虑檎f(shuō)明白。
參考資料:
《Java編程思想第四版》
《Effective Java》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/65641.html
摘要:靜態(tài)變量是被泛型類的所有實(shí)例所共享的。所以引用能完成泛型類型的檢查。對(duì)于這個(gè)類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關(guān)系取決于泛型類自身的繼承體系結(jié)構(gòu)。事實(shí)上,泛型類擴(kuò)展都不合法。 前言 和C++以模板來(lái)實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時(shí)支持選擇了泛型,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...
摘要:可以看到,如果我們給泛型類制定了上限,泛型擦除之后就會(huì)被替換成類型的上限。相應(yīng)的,泛型類中定義的方法的類型也是如此。參考語(yǔ)言類型擦除下界通配符和的區(qū)別 本篇博客主要介紹了Java類型擦除的定義,詳細(xì)的介紹了類型擦除在Java中所出現(xiàn)的場(chǎng)景。 1. 什么是類型擦除 為了讓你們快速的對(duì)類型擦除有一個(gè)印象,首先舉一個(gè)很簡(jiǎn)單也很經(jīng)典的例子。 // 指定泛型為String List list1 ...
摘要:泛型類在類的申明時(shí)指定參數(shù),即構(gòu)成了泛型類。換句話說(shuō),泛型類可以看成普通類的工廠。的作用就是指明泛型的具體類型,而類型的變量,可以用來(lái)創(chuàng)建泛型類的對(duì)象。只有聲明了的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項(xiàng)新特性,它的本質(zhì)是參數(shù)化類型(Parameterized Type)的應(yīng)用,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),...
閱讀 2408·2021-09-28 09:45
閱讀 3652·2021-09-24 09:48
閱讀 2325·2021-09-22 15:49
閱讀 3179·2021-09-08 16:10
閱讀 1658·2019-08-30 15:54
閱讀 2397·2019-08-30 15:53
閱讀 3078·2019-08-29 18:42
閱讀 2926·2019-08-29 16:19