Java中泛型的接口、通配符使用詳解
Java中的泛型
泛型應(yīng)用類型
泛型定義時常用方式有三種(可參考List<E>,Map<K,V)等接口定義):
- 泛型類:class 類名<泛型,…>{}
- 泛型接口:interface 接口名<泛型,…>{}
- 泛型方法: <泛型> 方法返回值類型 方法名(形參){}
1 -定義
編譯時的類型安全監(jiān)測機制,也可以把這個數(shù)據(jù)類型理解成是一種可以傳遞的參數(shù)
泛型類、泛型方法、泛型接口
2 - 泛型定義格式
<類型>:表示一種類型的格式
<類型1,類型2......> :表示是多種類型的格式,用逗號分割
class Array<T>{//類泛型:類名<泛型> Object[] array=new Object[10]; public void add(T t){}//通過類泛型約束方法參數(shù)類型 public T get(int i){//通過類泛型約束方法返回值類型 return (T)array[i]; } }
3 - 使用泛型的好處
- 把運行期間可能出現(xiàn)的問題,拿到編譯期間(錯誤等級的提升)
- 避免強制類型轉(zhuǎn)換丟失精度等問題的出現(xiàn)
4 - 泛型類
/** * @author Mr.樂 * @Description 泛型類 * E - Element * K - Key * T - Type * V - Value */ public class Generic<T> { //這個成員變量的類型為T,T的類型由外部指定 private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } } ------------------------------------- /** * @author Mr.樂 * @Description 泛型類測試類 */ public class Demo01 { public static void main(String[] args) { Generic<String> strG = new Generic<>();//創(chuàng)建泛型類對象 strG.setT("我是一個字符串!~"); 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)建泛型方法類的對象 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("我是實現(xiàn)類中的show方法:" + t); } } --------------------------------------------------------------------- /** * @author Mr.樂 * @Description */ public class Demo03 { public static void main(String[] args) { GenericImpl<String> strG = new GenericImpl<>(); strG.show("字符串"); //通過匿名內(nèi)部類實現(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> 上限 ?僅為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> 下限 ?僅為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é)
泛型,大家用到最多的就是在集合中,在實際的開發(fā)過程中,自己可以使用泛型去簡化開發(fā),保證同種類型,能很好的保證代碼質(zhì)量。
到此這篇關(guān)于Java中泛型的接口、通配符使用詳解的文章就介紹到這了,更多相關(guān)Java中的泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn)
Prometheus作為一個開源的監(jiān)控和告警工具,以其強大的數(shù)據(jù)采集、存儲和查詢能力,受到了眾多開發(fā)者的青睞,本文主要介紹了SpringBoot集成 Prometheus進行高效監(jiān)控的實現(xiàn),感興趣的可以了解一下2024-07-07詳解mybatis中association和collection的column傳入多個參數(shù)問題
這篇文章主要介紹了詳解mybatis中association和collection的column傳入多個參數(shù)問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析
這篇文章主要介紹了Spring Boot ActiveMQ發(fā)布/訂閱消息模式原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07如何用Java來進行文件切割和簡單的內(nèi)容過濾的實現(xiàn)
這篇文章主要介紹了如何用Java來進行文件切割和簡單的內(nèi)容過濾的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01Java網(wǎng)絡(luò)編程之UDP實現(xiàn)原理解析
UDP實現(xiàn)通信非常簡單,沒有服務(wù)器,每個都是客戶端,每個客戶端都需要一個發(fā)送端口和一個接收端口,本文給大家介紹Java網(wǎng)絡(luò)編程之UDP實現(xiàn)原理解析,感興趣的朋友一起看看吧2021-09-09