国产精品色哟哟_男男激情3p互攻_色偷偷影院_和女同学厕所做了四次

當(dāng)前位置: 首頁(yè) / 技術(shù)干貨 / 正文
民哥帶你快速精通java泛型(二)

2022-10-19

泛型 類型 問(wèn)題

  泛型的橫空出世

  1. 為什么引入泛型/引入泛型的必要性

  來(lái),我們深入分析下上述代碼運(yùn)行時(shí)出現(xiàn)錯(cuò)誤的主要原因:

  ArrayList的本質(zhì)是一個(gè)Object數(shù)組Object[] elementArr,這種設(shè)計(jì)雖然體現(xiàn)出來(lái)了泛型的思想(泛型:泛指任意類型),但是有以下問(wèn)題:

  ArrayList實(shí)例化之后,可以隨意添加任意類型的對(duì)象(Obeject是任意引用類型的基類)。

  獲取元素的前提是:需要提前知道列表元素的類型。

  獲取列表元素時(shí)然后進(jìn)行操作,都需要進(jìn)行顯式類型轉(zhuǎn)換,容易發(fā)生類型轉(zhuǎn)換出錯(cuò)的問(wèn)題。

  由于早期我們開(kāi)發(fā)者經(jīng)常操作集合對(duì)象,所以頻繁的出現(xiàn)運(yùn)行期間異常問(wèn)題,這種問(wèn)題困擾了很多人,SUN官方的設(shè)計(jì)師們也下定決心解決這個(gè)問(wèn)題,這些大佬們?cè)谙耄?如果集合能和數(shù)組一樣,在定義時(shí)就指定好類型,這樣就不會(huì)出現(xiàn)運(yùn)行期間異常問(wèn)題了,也就規(guī)避了很多安全隱患。

  所以SUN官方提出了泛型技術(shù)來(lái)解決操作集合中存在的這些問(wèn)題。

  2. 泛型的引入時(shí)機(jī)

  SUN官方在推出jdk1.5版本時(shí),就對(duì)這樣的問(wèn)題提出了解決方案: 泛型。

  泛型的由來(lái):通過(guò)Object轉(zhuǎn)型問(wèn)題引入 ,早期的Object類型可以接收任意的對(duì)象類型,泛型其實(shí)指的就是任意的對(duì)象類型,但是在實(shí)際的使用中,會(huì)有類型轉(zhuǎn)換的問(wèn)題。也就存在這隱患,所以Java提供了泛型來(lái)解決這個(gè)安全問(wèn)題。

  所以后期SUN官方的這些大佬們,對(duì)泛型的設(shè)計(jì)核心思想就兩條:

  在定義時(shí),泛型可以指任意的對(duì)象類型。

  在使用時(shí),必須明確泛型的具體對(duì)象類型。

  來(lái)我們看一下,SUN官方j(luò)dk1.5之后,對(duì)List集合的改造:

/**
* @param <E> the type of elements in this list: 定義List時(shí),E可以指代任意對(duì)象的類型
*/
public interface List<E> extends Collection<E> {
----------
}

  下面我們看一下List的使用:

public class GenericsDemo {
public static void main(String[] args) {

//1.創(chuàng)建一個(gè)List對(duì)象:指定泛型為String
List<String> list = new ArrayList<String>();
//2.向List中添加數(shù)據(jù):必須添加String類型的數(shù)據(jù)
list.add("corn");
list.add("java");
//3.遍歷集合
for (int i = 0; i <list.size() ; i++) {
//4.把集合中的每個(gè)元素轉(zhuǎn)成String類型
String ele = (String) list.get(i);
//5.打印-測(cè)試結(jié)果
System.out.println("元素的值:"+ele);
}
}
}

  那么如果我們使用 Listlist 添加其它類型的數(shù)據(jù)呢?

  可以看到下圖:不允許添加除String類型以外的,其它類型的數(shù)據(jù),這樣后期操作就不會(huì)有問(wèn)題了。

a2

  小伙伴,我們來(lái)簡(jiǎn)單的總結(jié)一下:

  雖然泛型在定義時(shí)可以表示任意對(duì)象的類型,但是我們?cè)谑褂檬牵仨毭鞔_泛型指代的具體類型,那么就這么一點(diǎn)小小的改動(dòng)帶來(lái)的確實(shí)本質(zhì)性的變化: 一勞永逸,體現(xiàn)了泛型的通用性,規(guī)避了很多安全問(wèn)題。

  3. 泛型能做的哪些事

  經(jīng)過(guò)我們剛才的"一頓分析與操作",小伙伴應(yīng)該基本清楚了泛型能夠解決那些問(wèn)題了。

  jdk1.5之后加入泛型,主要是為了解決類型轉(zhuǎn)換的安全隱患,具體體現(xiàn)如下:

  解決泛型對(duì)象實(shí)例化之后,可以隨意添加任何類型的對(duì)象的問(wèn)題。

  解決獲取泛型元素前,需要提前確定元素的類型的問(wèn)題。

  解決獲取元素時(shí),需要進(jìn)行顯式類型轉(zhuǎn)換的問(wèn)題。

  解決容易出現(xiàn)類型轉(zhuǎn)換出錯(cuò)的問(wèn)題。

  那么小伙伴們,我們通過(guò)下面代碼來(lái)細(xì)細(xì)品味一番:

public class GenericsDemo2 {
public static void main(String[] args) {

//1.創(chuàng)建一個(gè)泛型為String的集合: 解決泛型對(duì)象實(shí)例化之后,可以隨意添加任何類型的對(duì)象的問(wèn)題。
List<String> list = new ArrayList<String>();
//2.向List中添加String類型的數(shù)據(jù):解決獲取泛型元素前,需要提前確定元素的類型的問(wèn)題。。
list.add("corn");
list.add("java");
//list.add(66);//報(bào)編譯錯(cuò)誤:不能添加int型的數(shù)據(jù)
//3.遍歷集合
for (int i = 0; i <list.size() ; i++) {
//4.把集合中的每個(gè)元素:解決獲取元素時(shí),需要進(jìn)行顯式類型轉(zhuǎn)換的問(wèn)題。
String ele = list.get(i);// 不需要類型強(qiáng)轉(zhuǎn):解決容易出現(xiàn)類型轉(zhuǎn)換出錯(cuò)的問(wèn)題。
//5.打印-測(cè)試結(jié)果
System.out.println("元素的值:"+ele);
}
}
}

  其實(shí)看完這些代碼后,想必小伙伴心中都有了一個(gè)明確的答案:

  之前我們沒(méi)有使用泛型操作集合,可以添加任意類型的數(shù)據(jù),在后期運(yùn)行代碼時(shí),進(jìn)行類型轉(zhuǎn)換就會(huì)出問(wèn)題。

  如果我們使用了泛型,那么在添加數(shù)據(jù)時(shí),如果添加的數(shù)據(jù)類型不對(duì),編譯就會(huì)出問(wèn)題,更不用說(shuō)后期運(yùn)行了。

  所以我們用一句話總結(jié)泛型:

  泛型主要是將運(yùn)行期間的異常問(wèn)題,轉(zhuǎn)移到編譯期間來(lái)體現(xiàn),避免了類型強(qiáng)制轉(zhuǎn)換的問(wèn)題。

  闖關(guān)練習(xí)

  需求:創(chuàng)建一個(gè)指定泛型為Integer的Set集合,添加數(shù)字1到100,取出里面的偶數(shù)。

  答案:

public class GenericsDemo3 {
public static void main(String[] args) {
//1.創(chuàng)建一個(gè)泛型為Integer的集合
Set<Integer> numbers = new HashSet<Integer>();
//2.向set集合中添加數(shù)字:1-100
for (int i = 1; i <=100 ; i++) {
numbers.add(i);
}
//3.遍歷set集合,獲取里面的偶數(shù)并打印
for (Integer elementData : numbers) {
//4.條件判斷:
if(elementData%2==0){
//5.打印測(cè)試:
System.out.println("偶數(shù)是:"+elementData);
}
}
}
}

好程序員公眾號(hào)

  • · 剖析行業(yè)發(fā)展趨勢(shì)
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開(kāi)班動(dòng)態(tài)

More+
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽(tīng)
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報(bào)名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)