java的泛型你真的了解嗎
泛型的概述和優(yōu)勢
泛型概述
泛型:是JDK5中引入的特性,可以在編譯階段約束操作的數(shù)據(jù)類型,并進(jìn)行檢查。 泛型的格式:<數(shù)據(jù)類型>; 注意:泛型只能支持引用數(shù)據(jù)類型。 集合體系的全部接口和實(shí)現(xiàn)類都是支持泛型的使用的。
泛型的好處:
統(tǒng)一數(shù)據(jù)類型。 把運(yùn)行時(shí)期的問題提前到了編譯期間,避免了強(qiáng)制類型轉(zhuǎn)換可能出現(xiàn)的異常,因?yàn)榫幾g階段類型就能確定下來。
泛型可以在很多地方進(jìn)行定義:
類后面 --> 泛型類 方法申明上 --> 泛型方法 接口后面 --> 泛型接口
自定義泛型類
泛型類的概述
定義類時(shí)同時(shí)定義了 泛型的類 就是 泛型類。
泛型類的格式:修飾符 class 類名<泛型變量(只能是引用類型)>{ }
范例:public class MyArrayList<T> { }
此處泛型變量T可以隨便寫為任意標(biāo)識,常見的如E、T、K、V等。
作用:編譯階段可以指 定數(shù)據(jù)類型**(必須是引用類型)**,類似于集合的作用。
課程案例導(dǎo)學(xué)
模擬ArrayList集合自定義一個(gè)集合MyArrayList集合,完成添加和刪除功能的泛型設(shè)計(jì)即可。
問題1:泛型類的核心思想?
把出現(xiàn)泛型變量的地方全部替換成傳輸?shù)恼鎸?shí)數(shù)據(jù)類型
問題2:泛型類的作用?
編譯階段約定操作的數(shù)據(jù)的類型,類似于集合的作用。
自定義泛型方法
泛型方法的概述
定義方法時(shí)同時(shí)定義了 泛型的方法 就是 泛型方法。
泛型方法的格式:修飾符 <泛型變量> 方法返回值 方法名稱(形參列表){}
范例: public <T> void show(T t) { // <T>表示參數(shù)的類型,一般在public或者static的后面
}
作用:方法中可以使用泛型接收一切實(shí)際類型的參數(shù),方法更具備通用性。
課程案例導(dǎo)學(xué)
給你任何一個(gè)類型的數(shù)組,都能返回它的內(nèi)容。也就是實(shí)現(xiàn)Arrays.toString(數(shù)組)的功能!
public class GeneticDemo {
public static void main(String[] args) {
String[] names = {"lushimeng", "yangyinyu", "wangliang", "xigua", "xiangjia"};
printArray(names); // 把printArray方法中出現(xiàn)泛型的地方全部變化為String類型
Character[] character = {'2', 'd', 'd', 'r'};
printArray(character); // 把printArray方法中出現(xiàn)泛型的地方全部變化為Character類型
Integer[] ages = {23, 435, 56, 67, 67};
printArray(ages); // 把printArray方法中出現(xiàn)泛型的地方全部變化為Integer類型
}
public static <T> void printArray(T[] array){
if(array != null){
StringBuilder sb = new StringBuilder("[");
for(int i = 0; i < array.length; i++){
sb.append(array[i]).append(i != array.length - 1 ? ", ": ""); // StringBuilder的鏈?zhǔn)骄幊?
}
sb.append("]");
System.out.println(sb);
}else{
System.out.println(array);
}
}
}
問題1、泛型方法的核心思想:
把出現(xiàn)泛型變量的地方 全部替換 成傳輸?shù)恼鎸?shí)數(shù)據(jù)類型
問題2、泛型方法的作用
方法中可以使用泛型接收一 切實(shí)際類型的參數(shù),方法更具備通用性
自定義泛型接口
泛型接口的概述
使用了泛型定義的接口就是泛型接口。
泛型接口的格式:修飾符 interface 接口名稱<泛型變量>{
}
范例: public interface Data<E>{}
課程案例導(dǎo)學(xué)
教務(wù)系統(tǒng),提供一個(gè)接口可約束一定要完成數(shù)據(jù)(學(xué)生,老師)的增刪改查操作

問題1、泛型接口的作用
泛型接口可以約束實(shí)現(xiàn)類,實(shí)現(xiàn)類可以在實(shí)現(xiàn)接口的時(shí)候傳入自己操作的數(shù)據(jù)類型這樣重寫的方法都將是針對于該類型的操作。
泛型通配符、上下限
通配符:?
? 可以在“使用泛型”的時(shí)候代表 一切類型。 E T K V 是在定義 泛型 的時(shí)候使用的。
泛型通配符:案例導(dǎo)學(xué)
開發(fā)一個(gè)極品飛車的游戲,所有的汽車都能一起參與比賽。
特別注意:雖然BMW和BENZ都繼承了Car但是ArrayList<BMW>和ArrayList<BENZ>與ArrayList<Car>沒有關(guān)系的!!
import java.util.ArrayList;
public class GenericDemo {
public static void main(String[] args) {
ArrayList<BENZ> benzs = new ArrayList<>();
benzs.add(new BENZ());
benzs.add(new BENZ());
benzs.add(new BENZ());
go(benzs); // ? extends Car 為Car的子類都可以傳入進(jìn)去
ArrayList<BMW> bmws = new ArrayList<>();
bmws.add(new BMW());
bmws.add(new BMW());
bmws.add(new BMW());
go(bmws);
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
// go(dogs); // 不滿足泛型上下限的條件
}
public static void go(ArrayList<? extends Car> car){ // 上下限
}
}
class Dog{
}
// 父類
class Car{
}
class BENZ extends Car{
}
class BMW extends Car{
}
泛型的上下限:
? 可以在“使用泛型”的時(shí)候代表 一切類型。 ? extends Car: ?必須是Car或者其子類 泛型上限 ? super Car : ?必須是Car或者其父類 泛型下限
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享
狀態(tài)機(jī)是一種數(shù)學(xué)模型,對于我們業(yè)務(wù)實(shí)現(xiàn)有很大的幫助。我們可以用非常多的方法實(shí)現(xiàn)狀態(tài)機(jī),這篇文章就來介紹一個(gè)狀態(tài)機(jī)優(yōu)雅的實(shí)現(xiàn)方法,希望對大家有所幫助2023-04-04
利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并
Jackson的功能豐富,安全可靠并且具有比較好的兼容性,這讓程序開發(fā)人員可以很方便地實(shí)現(xiàn)JSON 數(shù)據(jù)的相互轉(zhuǎn)換,下面小編就來和大家介紹一下如何利用Jackson實(shí)現(xiàn)JSON數(shù)據(jù)的合并吧2025-03-03
Spring @Lookup深入分析實(shí)現(xiàn)原理
這篇文章主要介紹了Spring @Lookup實(shí)現(xiàn)原理,我們知道在spring容器中單獨(dú)的一個(gè)抽象類是不能成為一個(gè)bean的,那么有沒有辦法呢?這個(gè)時(shí)候我們可以使用Lookup注解2023-01-01
如何在Maven項(xiàng)目配置pom.xml指定JDK版本和編碼
maven是個(gè)項(xiàng)目管理工具,如果我們不告訴它要使用什么樣的jdk版本編譯,它就會(huì)用maven-compiler-plugin默認(rèn)的jdk版本來處理,這樣就容易出現(xiàn)版本不匹配的問題,這篇文章主要給大家介紹了關(guān)于如何在Maven項(xiàng)目配置pom.xml指定JDK版本和編碼的相關(guān)資料,需要的朋友可以參考下2024-01-01
spring boot動(dòng)態(tài)加載Echart餅狀圖
這篇文章主要為大家詳細(xì)介紹了spring boot動(dòng)態(tài)加載Echart餅狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
詳解Spring boot Admin 使用eureka監(jiān)控服務(wù)
本篇文章主要介紹了詳解Spring boot Admin 使用eureka監(jiān)控服務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12

