日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 泛型詳解(超詳細(xì)的java泛型方法解析)

瀏覽:184日期:2022-08-09 14:32:52
目錄2. 什么是泛型3. 使用泛型的好處4. 泛型的使用4.1 泛型類(lèi)4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高級(jí)使用6. 總結(jié)1. 為什么使用泛型

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

來(lái)看一個(gè)經(jīng)典案例:

public static void main(String[] args) {//測(cè)試一下泛型的經(jīng)典案例ArrayList arrayList = new ArrayList();arrayList.add('helloWorld');arrayList.add('taiziyenezha');arrayList.add(88);//由于集合沒(méi)有做任何限定,任何類(lèi)型都可以給其中存放for (int i = 0; i < arrayList.size(); i++) { //需求:打印每個(gè)字符串的長(zhǎng)度,就要把對(duì)象轉(zhuǎn)成String類(lèi)型 String str = (String) arrayList.get(i); System.out.println(str.length());} }

運(yùn)行這段代碼,程序在運(yùn)行時(shí)發(fā)生了異常:

Exception in thread 'main' java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

發(fā)生了數(shù)據(jù)類(lèi)型轉(zhuǎn)換異常,這是為什么?

由于ArrayList可以存放任意類(lèi)型的元素。例子中添加了一個(gè)String類(lèi)型,添加了一個(gè)Integer類(lèi)型,再使用時(shí)都以String的方式使用,導(dǎo)致取出時(shí)強(qiáng)制轉(zhuǎn)換為String類(lèi)型后,引發(fā)了ClassCastException,因此程序崩潰了。

這顯然不是我們所期望的,如果程序有潛在的錯(cuò)誤,我們更期望在編譯時(shí)被告知錯(cuò)誤,而不是在運(yùn)行時(shí)報(bào)異常。而為了解決類(lèi)似這樣的問(wèn)題(在編譯階段就可以解決),在jdk1.5后,泛型應(yīng)運(yùn)而生。讓你在設(shè)計(jì)API時(shí)可以指定類(lèi)或方法支持泛型,這樣我們使用API的時(shí)候也變得更為簡(jiǎn)潔,并得到了編譯時(shí)期的語(yǔ)法檢查。

我們將第一行聲明初始化ArrayList的代碼更改一下,編譯器就會(huì)在編譯階段就能夠幫我們發(fā)現(xiàn)類(lèi)似這樣的問(wèn)題。現(xiàn)在再看看效果。

ArrayList<String> arrayList = new ArrayList<>();arrayList.add('helloWorld');arrayList.add('taiziyenezha');arrayList.add(88);// 在編譯階段,編譯器就會(huì)報(bào)錯(cuò)

這樣可以避免了我們類(lèi)型強(qiáng)轉(zhuǎn)時(shí)出現(xiàn)異常。

2. 什么是泛型

泛型:是一種把明確類(lèi)型的工作推遲到創(chuàng)建對(duì)象或者調(diào)用方法的時(shí)候才去明確的特殊的類(lèi)型。也就是說(shuō)在泛型使用過(guò)程中,操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù),而這種參數(shù)類(lèi)型可以用在類(lèi)、方法和接口中,分別被稱(chēng)為泛型類(lèi)、泛型方法、泛型接口。

注意:一般在創(chuàng)建對(duì)象時(shí),將未知的類(lèi)型確定具體的類(lèi)型。當(dāng)沒(méi)有指定泛型時(shí),默認(rèn)類(lèi)型為Object類(lèi)型。

3. 使用泛型的好處 避免了類(lèi)型強(qiáng)轉(zhuǎn)的麻煩。 它提供了編譯期的類(lèi)型安全,確保在泛型類(lèi)型(通常為泛型集合)上只能使用正確類(lèi)型的對(duì)象,避免了在運(yùn)行時(shí)出現(xiàn)ClassCastException。4. 泛型的使用

泛型雖然通常會(huì)被大量的使用在集合當(dāng)中,但是我們也可以完整的學(xué)習(xí)泛型只是。泛型有三種使用方式,分別為:泛型類(lèi)、泛型方法、泛型接口。將數(shù)據(jù)類(lèi)型作為參數(shù)進(jìn)行傳遞。

4.1 泛型類(lèi)

泛型類(lèi)型用于類(lèi)的定義中,被稱(chēng)為泛型類(lèi)。通過(guò)泛型可以完成對(duì)一組類(lèi)的操作對(duì)外開(kāi)放相同的接口。最典型的就是各種集合框架容器類(lèi),如:List、Set、Map。

泛型類(lèi)的定義格式:

修飾符 class 類(lèi)名<代表泛型的變量> { }

怕你不清楚怎么使用,這里我還是做了一個(gè)簡(jiǎn)單的泛型類(lèi):

/** * @param <T> 這里解釋下<T>中的T: * 此處的T可以隨便寫(xiě)為任意標(biāo)識(shí),常見(jiàn)的有T、E等形式的參數(shù)表示泛型 * 泛型在定義的時(shí)候不具體,使用的時(shí)候才變得具體。 * 在使用的時(shí)候確定泛型的具體數(shù)據(jù)類(lèi)型。即在創(chuàng)建對(duì)象的時(shí)候確定泛型。 */public class GenericsClassDemo<T> { //t這個(gè)成員變量的類(lèi)型為T(mén),T的類(lèi)型由外部指定 private T t; //泛型構(gòu)造方法形參t的類(lèi)型也為T(mén),T的類(lèi)型由外部指定 public GenericsClassDemo(T t) {this.t = t; } //泛型方法getT的返回值類(lèi)型為T(mén),T的類(lèi)型由外部指定 public T getT() {return t; }}

泛型在定義的時(shí)候不具體,使用的時(shí)候才變得具體。在使用的時(shí)候確定泛型的具體數(shù)據(jù)類(lèi)型。即:在創(chuàng)建對(duì)象的時(shí)候確定泛型。

例如:Generic<String> genericString = new Generic<String>('helloGenerics');

此時(shí),泛型標(biāo)識(shí)T的類(lèi)型就是String類(lèi)型,那我們之前寫(xiě)的類(lèi)就可以這么認(rèn)為:

public class GenericsClassDemo<String> { private String t; public GenericsClassDemo(String t) {this.t = t; } public String getT() {return t; }}

當(dāng)你的泛型類(lèi)型想變?yōu)镮nteger類(lèi)型時(shí),也是很方便的。直接在創(chuàng)建時(shí),T寫(xiě)為Integer類(lèi)型即可:

Generic<Integer> genericInteger = new Generic<Integer>(666);

注意: 定義的泛型類(lèi),就一定要傳入泛型類(lèi)型實(shí)參么?

并不是這樣,在使用泛型的時(shí)候如果傳入泛型實(shí)參,則會(huì)根據(jù)傳入的泛型實(shí)參做相應(yīng)的限制,此時(shí)泛型才會(huì)起到本應(yīng)起到的限制作用。如果不傳入泛型類(lèi)型實(shí)參的話,在泛型類(lèi)中使用泛型的方法或成員變量定義的類(lèi)型可以為任何的類(lèi)型。即跟之前的經(jīng)典案例一樣,沒(méi)有寫(xiě)ArrayList的泛型類(lèi)型,容易出現(xiàn)類(lèi)型強(qiáng)轉(zhuǎn)的問(wèn)題。

4.2 泛型方法

泛型方法,是在調(diào)用方法的時(shí)候指明泛型的具體類(lèi)型 。

定義格式:

修飾符 <代表泛型的變量> 返回值類(lèi)型 方法名(參數(shù)){ }

例如:

/** * * @param t 傳入泛型的參數(shù) * @param <T> 泛型的類(lèi)型 * @return T 返回值為T(mén)類(lèi)型 * 說(shuō)明: * 1)public 與 返回值中間<T>非常重要,可以理解為聲明此方法為泛型方法。 * 2)只有聲明了<T>的方法才是泛型方法,泛型類(lèi)中的使用了泛型的成員方法并不是泛型方法。 * 3)<T>表明該方法將使用泛型類(lèi)型T,此時(shí)才可以在方法中使用泛型類(lèi)型T。 * 4)與泛型類(lèi)的定義一樣,此處T可以隨便寫(xiě)為任意標(biāo)識(shí),常見(jiàn)的如T、E等形式的參數(shù)常用于表示泛型。 */ public <T> T genercMethod(T t){System.out.println(t.getClass());System.out.println(t);return t; }

調(diào)用方法時(shí),確定泛型的類(lèi)型

public static void main(String[] args) { GenericsClassDemo<String> genericString = new GenericsClassDemo('helloGeneric'); //這里的泛型跟下面調(diào)用的泛型方法可以不一樣。 String str = genericString.genercMethod('hello');//傳入的是String類(lèi)型,返回的也是String類(lèi)型 Integer i = genericString.genercMethod(123);//傳入的是Integer類(lèi)型,返回的也是Integer類(lèi)型}

這里我們可以看下結(jié)果:

class java.lang.String

hello

class java.lang.Integer123

這里可以看出,泛型方法隨著我們的傳入?yún)?shù)類(lèi)型不同,他得到的類(lèi)型也不同。泛型方法能使方法獨(dú)立于類(lèi)而產(chǎn)生變化。

4.3 泛型接口

泛型接口與泛型類(lèi)的定義及使用基本相同。泛型接口常被用在各種類(lèi)的生產(chǎn)器中。

定義格式

修飾符 interface接口名<代表泛型的變量> { }

看一下下面的例子,你就知道怎么定義一個(gè)泛型接口了:

/** * 定義一個(gè)泛型接口 */public interface GenericsInteface<T> { public abstract void add(T t); }

使用格式

1、定義類(lèi)時(shí)確定泛型的類(lèi)型

public class GenericsImp implements GenericsInteface<String> { @Override public void add(String s) {System.out.println('設(shè)置了泛型為String類(lèi)型'); }} 2、始終不確定泛型的類(lèi)型,直到創(chuàng)建對(duì)象時(shí),確定泛型的類(lèi)型

public class GenericsImp<T> implements GenericsInteface<T> { @Override public void add(T t) {System.out.println('沒(méi)有設(shè)置類(lèi)型'); }}

確定泛型:

public class GenericsTest { public static void main(String[] args) {GenericsImp<Integer> gi = new GenericsImp<>();gi.add(66); }}5. 泛型通配符

當(dāng)使用泛型類(lèi)或者接口時(shí),傳遞的數(shù)據(jù)中,泛型類(lèi)型不確定,可以通過(guò)通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object類(lèi)中的共性方法,集合中元素自身方法無(wú)法使用。

5.1 通配符基本使用

泛型的通配符:不知道使用什么類(lèi)型來(lái)接收的時(shí)候,此時(shí)可以使用?,?表示未知通配符。

此時(shí)只能接受數(shù)據(jù),不能往該集合中存儲(chǔ)數(shù)據(jù)。

舉個(gè)例子大家理解使用即可:

// ?代表可以接收任意類(lèi)型// 泛型不存在繼承、多態(tài)關(guān)系,泛型左右兩邊要一樣//ArrayList<Object> list = new ArrayList<String>();這種是錯(cuò)誤的//泛型通配符?:左邊寫(xiě)<?> 右邊的泛型可以是任意類(lèi)型ArrayList<?> list1 = new ArrayList<Object>();ArrayList<?> list2 = new ArrayList<String>();ArrayList<?> list3 = new ArrayList<Integer>();

注意:泛型不存在繼承、多態(tài)關(guān)系,泛型左右兩邊要一樣,jdk1.7后右邊的泛型可以省略

而泛型通配符?,右邊的泛型可以是任意類(lèi)型。

泛型通配符?主要應(yīng)用在參數(shù)傳遞方面,讓我們一起瞧瞧唄:

public static void main(String[] args) { ArrayList<Integer> list1 = new ArrayList<Integer>(); test(list1); ArrayList<String> list2 = new ArrayList<String>(); test(list2);}public static void test(ArrayList<?> coll){}

嘿嘿,是不是見(jiàn)識(shí)到了通配符的厲害,可以傳遞不同類(lèi)似進(jìn)去方法中了!

5.2 通配符高級(jí)使用

之前設(shè)置泛型的時(shí)候,實(shí)際上是可以任意設(shè)置的,只要是類(lèi)就可以設(shè)置。但是在JAVA的泛型中可以指定一個(gè)泛型的上限下限

泛型的上限:

格式: 類(lèi)型名稱(chēng) <? extends 類(lèi) > 對(duì)象名稱(chēng) 意義: 只能接收該類(lèi)型及其子類(lèi)

泛型的下限:

格式: 類(lèi)型名稱(chēng) <? super 類(lèi) > 對(duì)象名稱(chēng) 意義: 只能接收該類(lèi)型及其父類(lèi)型

比如:現(xiàn)已知Object類(lèi),Animal類(lèi),Dog類(lèi),Cat類(lèi),其中Animal是Dog,Cat的父類(lèi)

class Animal{}//父類(lèi)class Dog extends Animal{}//子類(lèi)class Cat extends Animal{}//子類(lèi)

首先我們先看下,泛型的上限<? extends 類(lèi) >:

//ArrayList<? extends Animal> list = new ArrayList<Object>();//報(bào)錯(cuò)ArrayList<? extends Animal> list2 = new ArrayList<Animal>();ArrayList<? extends Animal> list3 = new ArrayList<Dog>();ArrayList<? extends Animal> list4 = new ArrayList<Cat>();

可以看出,泛型的上限只能是該類(lèi)型的類(lèi)型及其子類(lèi)。

Java 泛型詳解(超詳細(xì)的java泛型方法解析)

我們?cè)賮?lái)看看泛型的下限<? super 類(lèi) >:

ArrayList<? super Animal> list5 = new ArrayList<Object>();ArrayList<? super Animal> list6 = new ArrayList<Animal>();//ArrayList<? super Animal> list7 = new ArrayList<Dog>();//報(bào)錯(cuò)//ArrayList<? super Animal> list8 = new ArrayList<Cat>();//報(bào)錯(cuò)

可以看出,泛型的下限只能是該類(lèi)型的類(lèi)型及其父類(lèi)。

Java 泛型詳解(超詳細(xì)的java泛型方法解析)

一般泛型的上限和下限也是用來(lái)參數(shù)的傳遞:

再比如:現(xiàn)已知Object類(lèi),String 類(lèi),Number類(lèi),Integer類(lèi),其中Number是Integer的父類(lèi)

public static void main(String[] args) { Collection<Integer> list1 = new ArrayList<Integer>(); Collection<String> list2 = new ArrayList<String>(); Collection<Number> list3 = new ArrayList<Number>(); Collection<Object> list4 = new ArrayList<Object>(); getElement(list1); getElement(list2);//報(bào)錯(cuò) getElement(list3); getElement(list4);//報(bào)錯(cuò) getElement2(list1);//報(bào)錯(cuò) getElement2(list2);//報(bào)錯(cuò) getElement2(list3); getElement2(list4);}// 泛型的上限:此時(shí)的泛型?,必須是Number類(lèi)型或者Number類(lèi)型的子類(lèi)public static void getElement1(Collection<? extends Number> coll){}// 泛型的下限:此時(shí)的泛型?,必須是Number類(lèi)型或者Number類(lèi)型的父類(lèi)public static void getElement2(Collection<? super Number> coll){}118060630

學(xué)到這里,我們泛型也就學(xué)完了!

6. 總結(jié)

這篇文章就到這里了,如果這篇文章對(duì)你也有所幫助,希望您能多多關(guān)注好吧啦網(wǎng)的更多內(nèi)容!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本在线不卡视频| 中文精品在线| 欧美日韩在线精品一区二区三区激情综合 | 日韩av免费| 精品捆绑调教一区二区三区| 极品日韩av| 国产精品88久久久久久| 麻豆亚洲精品| 国产日韩免费| 桃色av一区二区| 国产一区亚洲| 免费美女久久99| 青青国产精品| 97精品国产福利一区二区三区| 色乱码一区二区三区网站| 在线观看精品| 免费欧美日韩| 国产精品免费99久久久| 日韩av专区| 狠狠色狠狠色综合日日tαg| 日本不卡在线视频| 精品一区二区三区亚洲| 日韩中文在线电影| 天使萌一区二区三区免费观看| 亚洲欧美网站在线观看| 欧美a在线观看| 亚洲精品va| 久久超级碰碰| 黄色av日韩| 国产精品成人自拍| 激情久久中文字幕| 欧美色综合网| 不卡中文一二三区| 国产福利一区二区精品秒拍 | 999国产精品永久免费视频app| 激情久久五月| 国产精品一在线观看| 亚洲午夜久久久久久尤物 | 人人精品久久| 久久亚洲国产| 欧美成人精品午夜一区二区| 婷婷色综合网| 麻豆精品少妇| 日韩精品一二区| 最新中文字幕在线播放| 亚洲精品国产精品粉嫩| 精品国内亚洲2022精品成人| 蜜臀va亚洲va欧美va天堂| 97精品国产| 国产午夜久久av| 在线亚洲一区| 精品视频网站| 亚洲另类黄色| 欧美 日韩 国产精品免费观看| 欧美日韩一视频区二区| 欧美在线网站| 成人高清一区| 欧美亚洲二区| 快she精品国产999| 久久久久99| 蜜桃久久久久| 免费精品视频在线| 999精品色在线播放| 国产精品www.| 日韩国产在线一| 亚洲成人三区| 国产成人免费精品| 日韩不卡在线观看日韩不卡视频 | 亚洲ww精品| 黄色免费成人| 视频福利一区| 精品亚洲二区| 麻豆精品视频在线观看视频| 美女尤物久久精品| 欧美特黄一区| 91精品一区二区三区综合在线爱 | 免费亚洲婷婷| 91亚洲精品在看在线观看高清 | 黄色不卡一区| 午夜av成人| av资源中文在线| 精品入口麻豆88视频| 日韩动漫一区| 亚洲精品九九| 综合激情五月婷婷| 欧美1级日本1级| 久久久久国产| 欧美日韩精品免费观看视欧美高清免费大片| 免费在线观看一区| 免费一级欧美片在线观看网站| 日韩成人在线看| 日韩免费精品| 综合欧美精品| 天堂va在线高清一区| 亚洲精品观看| 国产欧美日本| 久久精品国产99国产| 精品资源在线| 国产白浆在线免费观看| 精精国产xxxx视频在线野外| 热三久草你在线| 日韩精品免费一区二区在线观看| 日韩免费小视频| 欧美日韩中文字幕一区二区三区| av亚洲免费| 国产婷婷精品| 日韩中文字幕无砖| 91精品国产自产精品男人的天堂| 日韩不卡在线观看日韩不卡视频| 91精品国产经典在线观看| 国产精品亚洲欧美一级在线| 免费亚洲一区| 日韩国产一区二区| 免费黄色成人| 伊人久久大香伊蕉在人线观看热v| 丝袜亚洲精品中文字幕一区| 综合在线一区| 久久不见久久见国语| 另类专区亚洲| 午夜欧美在线| 日本免费在线视频不卡一不卡二| 国产精品蜜月aⅴ在线| 国产aⅴ精品一区二区四区| 日韩欧美一区二区三区在线观看| 一本一道久久a久久精品蜜桃| 亚洲免费观看高清完整版在线观| 国产欧美精品久久| 久久久久久婷| 激情婷婷久久| 亚洲精品系列| 国产视频一区二| 国产在线不卡一区二区三区| 亚洲伦乱视频| 日韩精品一级中文字幕精品视频免费观看 | 桃色av一区二区| 国产精品毛片在线看| 欧美日一区二区三区在线观看国产免 | 精品亚洲a∨| 久久精品青草| 天堂va在线高清一区| 高清不卡一区| 蜜臀久久久久久久| 你懂的网址国产 欧美| 国产综合视频| 久久99久久人婷婷精品综合| 久久中文字幕av一区二区不卡| 日韩在线网址| 99精品综合| 国产日韩在线观看视频| 欧美二区视频| 国产精品一区亚洲| 午夜精品网站| 国产成人a视频高清在线观看| 女同性一区二区三区人了人一 | 久久亚洲精品中文字幕蜜潮电影| 三级久久三级久久久| 欧美国产美女| 亚洲精品三级| 日韩av福利| 国产精品调教视频| 欧美高清不卡| 精品久久福利| 中文字幕一区二区三区日韩精品 | 日韩二区在线观看| 91精品一区国产高清在线gif| 日韩成人精品一区二区三区| 日韩精品免费一区二区在线观看| 日韩国产成人精品| 欧美不卡视频| 成人午夜亚洲| 91av一区| 国产亚洲高清视频| 黄色在线网站噜噜噜| 日韩成人av影视| 亚洲先锋成人| 精品久久国产一区| 日韩超碰人人爽人人做人人添| 免费视频一区三区| 国产v日韩v欧美v| 国产精品一卡| 婷婷综合成人| 99国产一区| 午夜欧美巨大性欧美巨大| 国产精品一区二区三区美女 | 亚洲电影在线| 乱一区二区av| 青青草精品视频| 日韩精品一级中文字幕精品视频免费观看 | 久久亚洲电影| 欧美+日本+国产+在线a∨观看| 狠狠久久伊人| 国产精品第一国产精品| 亚洲精品系列| 国产亚洲欧洲| 国产一在线精品一区在线观看| 久久久久久夜| 国内一区二区三区| 麻豆一区二区99久久久久| 欧美日本久久| 久久国际精品|