目錄
前言:
泛型:
額外拓展:
總結(jié):
前言:
????????本文將詳細(xì)介紹之前我們在JAVA 中一直在講的泛型,各位感興趣的同學(xué)可以點(diǎn)擊進(jìn)來觀看。
泛型:
????????泛型是一種編程概念,它允許在定義類、接口或方法時(shí)使用類型參數(shù),這樣可以在使用時(shí)指定實(shí)際的類型。通過使用泛型,可以創(chuàng)建可重用、類型安全的代碼,同時(shí)提高代碼的靈活性和可讀性。
????????泛型的主要目的是在編譯時(shí)提供類型檢查,以確保類型的一致性和安全性。它允許在不同的場景中使用相同的代碼,而無需為每種類型都編寫單獨(dú)的實(shí)現(xiàn)。泛型代碼在運(yùn)行時(shí)會被擦除為非泛型形式,這種機(jī)制稱為類型擦除。
????????在Java中,泛型使用尖括號(<>)來指定類型參數(shù)。例如,可以定義一個(gè)泛型類List<E>,其中E是類型參數(shù),表示列表中的元素類型。使用List<String>創(chuàng)建一個(gè)字符串類型的列表,使用List<Integer>創(chuàng)建一個(gè)整數(shù)類型的列表,它們都是相同的泛型類的實(shí)例,但元素類型不同。
????????泛型還可以用于方法和接口的定義。在方法中使用泛型參數(shù)可以使方法適用于不同類型的數(shù)據(jù),而無需為每種數(shù)據(jù)類型編寫不同的方法。接口中的泛型參數(shù)可以在實(shí)現(xiàn)接口時(shí)指定具體的類型。
泛型的優(yōu)點(diǎn):
1. 類型安全:編譯器可以在編譯時(shí)檢查類型錯(cuò)誤,避免運(yùn)行時(shí)類型轉(zhuǎn)換異常。
2. 代碼重用:可以編寫通用的代碼,適用于不同類型的數(shù)據(jù)。
3. 可讀性和可維護(hù)性:泛型代碼更易于理解和維護(hù),因?yàn)轭愋托畔⒖梢栽诙x時(shí)指定。
其實(shí)泛型的出現(xiàn),統(tǒng)一了集合中存儲的元素,如果不使用泛型,當(dāng)我們往集合中添加元素的時(shí)候,可以添加各種元素:數(shù)字,字符串等等,但是泛型規(guī)范了字符串中存儲的類型。
使用泛型時(shí)的注意事項(xiàng):
1.泛型不能寫基本數(shù)據(jù)類型。(下面有解釋)
2.指定泛型的基本類型之后,傳遞數(shù)據(jù)的時(shí)候,可以傳入該類類型或者其子類類型
2.如果不寫泛型,類型默認(rèn)是object類(其實(shí)寫了最后也是object類,下文有解釋)
不使用泛型向集合中輸入數(shù)據(jù):
import java.util.ArrayList;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add(123);
list.add("abc");
list.add(1.2);
//遍歷集合中的每一個(gè)元素
Iterator it = list.iterator();
while(it.hasNext())
{
Object element = it.next();
System.out.println(element);
}
}
}
運(yùn)行結(jié)果:
在不使用泛型的情況下,所有的數(shù)據(jù)都是Object類型的,此時(shí)可以向集合中添任意類型的數(shù)據(jù),但是缺點(diǎn)就是我們無法調(diào)用這個(gè)類型的特有行為,如果要強(qiáng)制調(diào)用就要使用類型轉(zhuǎn)換,而類型轉(zhuǎn)化有可能會帶來意想不到的錯(cuò)誤。
利用泛型向集合中輸入數(shù)據(jù):
import java.util.ArrayList;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
list.add(113);
list.add(125);
list.add(133);
//遍歷集合中的每一個(gè)元素
Iterator <Integer>it = list.iterator();
while(it.hasNext())
{
int em=it.next();
System.out.println(em);
}
}
}
運(yùn)行結(jié)果:
?我們可以看到在使用了泛型之后,我們的輸入元素就只能是指定類型,而且也不用object類型接收next的返回值,直接使用int類型的就可以了,這意味著我們可以直接調(diào)用這個(gè)類型的方法。
額外拓展:
但其實(shí)JAVA中的泛型是偽泛型。?
????????Java泛型在編譯時(shí)提供類型檢查的功能,但在運(yùn)行時(shí)會進(jìn)行類型擦除,即泛型的類型信息被擦除為原始類型(raw type)。
????????在Java中,泛型是在編譯時(shí)執(zhí)行類型檢查的機(jī)制,通過使用泛型,可以在定義類、接口和方法時(shí)使用類型參數(shù),并在使用時(shí)指定具體的類型。這樣可以提高代碼的類型安全性,并減少在運(yùn)行時(shí)可能出現(xiàn)的類型錯(cuò)誤。
????????然而,在Java中的泛型機(jī)制實(shí)際上是通過類型擦除來實(shí)現(xiàn)的。在編譯時(shí),編譯器會對泛型類型進(jìn)行檢查,確保類型的一致性。但在生成的字節(jié)碼中,泛型的類型信息會被擦除掉,所有的泛型類型都被替換為其原始類型。
由于類型擦除的存在,導(dǎo)致了一些限制和特殊情況:
1. 無法使用基本類型作為類型參數(shù),只能使用其對應(yīng)的包裝類。例如,不能使用基本類型int,而需要使用Integer。
2. 無法在運(yùn)行時(shí)獲取泛型的實(shí)際類型參數(shù)。例如,無法使用instanceof操作符或通過反射來確定泛型類型的實(shí)際參數(shù)化類型。
3. 在集合中無法存儲具體的泛型類型,只能存儲其原始類型。例如,無法創(chuàng)建一個(gè)ArrayList<int>,只能創(chuàng)建ArrayList<Integer>。
這種泛型類型擦除的機(jī)制被稱為"偽泛型",因?yàn)樵谶\(yùn)行時(shí)無法獲得泛型的類型信息。盡管如此,Java的泛型機(jī)制仍然提供了編譯時(shí)的類型檢查,減少了類型錯(cuò)誤的發(fā)生,并提高了代碼的可讀性和可維護(hù)性。
總而言之,"Java中的泛型是偽泛型"意味著Java的泛型在編譯時(shí)提供類型檢查,但在運(yùn)行時(shí)類型信息被擦除,只剩下原始類型。盡管存在一些限制和特殊情況,泛型仍然是一種有用的編程機(jī)制。
其實(shí)這些話概括起來就是:泛型雖然在向數(shù)組中輸入數(shù)據(jù)的時(shí)候,規(guī)定了數(shù)據(jù)的類型,但是這些數(shù)據(jù)在轉(zhuǎn)向字節(jié)碼的時(shí)候,數(shù)據(jù)類型都會被抹去,還是變?yōu)閛bject類型。我們把這種模式就叫做偽泛型。
總結(jié):
? ? ? ? 泛型是一個(gè)很實(shí)用的概念,它規(guī)范了數(shù)據(jù)的類型,便潔了我們的使用,因此我們要掌握好泛型這個(gè)概念,在后文我們也會對泛型的其他應(yīng)用做詳細(xì)的講解。
如果我的內(nèi)容對你有幫助,請點(diǎn)贊,評論,收藏。創(chuàng)作不易,大家的支持就是我堅(jiān)持下去的動(dòng)力!文章來源:http://www.zghlxwxcb.cn/news/detail-593106.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-593106.html
到了這里,關(guān)于【從零開始學(xué)習(xí)JAVA | 第二十五篇】泛型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!