Java中泛型的接口、通配符使用詳解
Java中的泛型
泛型應(yīng)用類型
泛型定義時(shí)常用方式有三種(可參考List<E>,Map<K,V)等接口定義):
- 泛型類:class 類名<泛型,…>{}
- 泛型接口:interface 接口名<泛型,…>{}
- 泛型方法: <泛型> 方法返回值類型 方法名(形參){}
1 -定義
編譯時(shí)的類型安全監(jiān)測(cè)機(jī)制,也可以把這個(gè)數(shù)據(jù)類型理解成是一種可以傳遞的參數(shù)
泛型類、泛型方法、泛型接口
2 - 泛型定義格式
<類型>:表示一種類型的格式
<類型1,類型2......> :表示是多種類型的格式,用逗號(hào)分割
class Array<T>{//類泛型:類名<泛型> Object[] array=new Object[10]; public void add(T t){}//通過(guò)類泛型約束方法參數(shù)類型 public T get(int i){//通過(guò)類泛型約束方法返回值類型 return (T)array[i]; } }
3 - 使用泛型的好處
- 把運(yùn)行期間可能出現(xiàn)的問(wèn)題,拿到編譯期間(錯(cuò)誤等級(jí)的提升)
- 避免強(qiáng)制類型轉(zhuǎn)換丟失精度等問(wèn)題的出現(xiàn)
4 - 泛型類
/** * @author Mr.樂 * @Description 泛型類 * E - Element * K - Key * T - Type * V - Value */ public class Generic<T> { //這個(gè)成員變量的類型為T,T的類型由外部指定 private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } } ------------------------------------- /** * @author Mr.樂 * @Description 泛型類測(cè)試類 */ public class Demo01 { public static void main(String[] args) { Generic<String> strG = new Generic<>();//創(chuàng)建泛型類對(duì)象 strG.setT("我是一個(gè)字符串!~"); System.out.println(strG.getT()); Generic<Integer> intG = new Generic<>(); intG.setT(1314); System.out.println(intG.getT()); } }
5 -泛型方法
/** * @author Mr.樂 * @Description */ public class Generic { //泛型方法 /*public <T> void show(T i) { System.out.println(i); }*/ //有返回值類型的泛型方法 public <T> T show(T i) { return i; } } ----------------------------- /** * @author Mr.樂 * @Description */ public class Demo02 { public static void main(String[] args) { Generic g = new Generic();//創(chuàng)建泛型方法類的對(duì)象 System.out.println(g.show(1314)); g.show("String"); g.show(3.14f); g.show(new Student("Andy",18)); } }
6 - 泛型接口
/** * @author Mr.樂 * @Description */ public interface Generic <T>{ void show(T t); } ---------------------------------- /** * @author Mr.樂 * @Description */ public class GenericImpl <T> implements Generic<T>{ @Override public void show(T t) { System.out.println("我是實(shí)現(xiàn)類中的show方法:" + t); } } --------------------------------------------------------------------- /** * @author Mr.樂 * @Description */ public class Demo03 { public static void main(String[] args) { GenericImpl<String> strG = new GenericImpl<>(); strG.show("字符串"); //通過(guò)匿名內(nèi)部類實(shí)現(xiàn) new Generic<Integer>() { @Override public void show(Integer integer) { System.out.println("我是匿名內(nèi)部類的show方法" + integer); } }.show(1314); } }
7 - 泛型通配符
import java.util.ArrayList; /** * @author Mr.樂 * @Description 泛型通配符 */ public class demo04 { public static void main(String[] args) { //<?> 通配所有 相當(dāng)于Object ArrayList<?> list01 = new ArrayList<Object>(); ArrayList<?> list02 = new ArrayList<Integer>();//Integer為Object子類 ArrayList<?> list03 = new ArrayList<Float>(); ArrayList<?> list04 = new ArrayList<Number>(); //<? extends Number> 上限 ??jī)H為Number類及子類 ArrayList<? extends Number> list05 = new ArrayList<Number>(); ArrayList<? extends Number> list06 = new ArrayList<Integer>(); ArrayList<? extends Number> list07 = new ArrayList<Float>(); // ArrayList<? extends Number> list08 = new ArrayList<String>(); //<? super Number> 下限 ??jī)H為Number類及父類 ArrayList<? super Number> list09 = new ArrayList<Number>(); // ArrayList<? super Number> list10 = new ArrayList<Integer>(); // ArrayList<? super Number> list11 = new ArrayList<String>(); ArrayList<? super Number> list12 = new ArrayList<Object>(); } }
8 - 泛型通配符的基本應(yīng)用
import java.util.ArrayList; /** * @author Mr.樂 * @Description 泛型通配符的基本應(yīng)用 */ public class Demo05 { public static void main(String[] args) { ArrayList<String> strList = new ArrayList<>(); show(strList); // showUp(strList); // showDown(strList); ArrayList<Integer> intList = new ArrayList<>(); show(intList); showUp(intList); // showDown(intList); ArrayList<Number> numList = new ArrayList<>(); show(numList); showUp(numList); showDown(numList); ArrayList<Object> objList = new ArrayList<>(); show(objList); // showUp(objList); showDown(objList); } //<?> 表示通配所有 private static void show(ArrayList<?> list){ } //表示上限 private static void showUp(ArrayList<? extends Number> list){ } //表示下限 private static void showDown(ArrayList<? super Number> list){ } }
總結(jié)
泛型,大家用到最多的就是在集合中,在實(shí)際的開發(fā)過(guò)程中,自己可以使用泛型去簡(jiǎn)化開發(fā),保證同種類型,能很好的保證代碼質(zhì)量。
到此這篇關(guān)于Java中泛型的接口、通配符使用詳解的文章就介紹到這了,更多相關(guān)Java中的泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn)
Prometheus作為一個(gè)開源的監(jiān)控和告警工具,以其強(qiáng)大的數(shù)據(jù)采集、存儲(chǔ)和查詢能力,受到了眾多開發(fā)者的青睞,本文主要介紹了SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn),感興趣的可以了解一下2024-07-07詳解mybatis中association和collection的column傳入多個(gè)參數(shù)問(wèn)題
這篇文章主要介紹了詳解mybatis中association和collection的column傳入多個(gè)參數(shù)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析
這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07JAVA SE包裝類和泛型詳細(xì)介紹及說(shuō)明方法
這篇文章主要介紹了JAVA SE包裝類和泛型的相關(guān)資料,包括基本數(shù)據(jù)類型與包裝類的對(duì)應(yīng)關(guān)系,以及裝箱和拆箱的概念,并重點(diǎn)講解了自動(dòng)裝箱和自動(dòng)拆箱的機(jī)制,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題
這篇文章主要介紹了解決spring項(xiàng)目找不到Aspect依賴注解的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06如何用Java來(lái)進(jìn)行文件切割和簡(jiǎn)單的內(nèi)容過(guò)濾的實(shí)現(xiàn)
這篇文章主要介紹了如何用Java來(lái)進(jìn)行文件切割和簡(jiǎn)單的內(nèi)容過(guò)濾的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01Java網(wǎng)絡(luò)編程之UDP實(shí)現(xiàn)原理解析
UDP實(shí)現(xiàn)通信非常簡(jiǎn)單,沒有服務(wù)器,每個(gè)都是客戶端,每個(gè)客戶端都需要一個(gè)發(fā)送端口和一個(gè)接收端口,本文給大家介紹Java網(wǎng)絡(luò)編程之UDP實(shí)現(xiàn)原理解析,感興趣的朋友一起看看吧2021-09-09