首頁 > 軟體

java的泛型你真的瞭解嗎

2022-03-29 13:04:50

泛型的概述和優勢

泛型概述

泛型:是JDK5中引入的特性,可以在編譯階段約束操作的資料型別,並進行檢查。
泛型的格式:<資料型別>; 注意:泛型只能支援參照資料型別。
集合體系的全部介面和實現類都是支援泛型的使用的。

泛型的好處:

統一資料型別。
把執行時期的問題提前到了編譯期間,避免了強制型別轉換可能出現的異常,因為編譯階段型別就能確定下來。

泛型可以在很多地方進行定義:

類後面           -->    泛型類
方法申明上    -->   泛型方法
介面後面        -->  泛型介面

自定義泛型類

泛型類的概述

定義類時同時定義了  泛型的類  就是  泛型類。
泛型類的格式:修飾符 class 類名<泛型變數(只能是參照型別)>{  }
範例:public class MyArrayList<T> {  }
 此處泛型變數T可以隨便寫為任意標識,常見的如E、T、K、V等。

作用:編譯階段可以指 定資料型別**(必須是參照型別)**,類似於集合的作用。

課程案例導學

模擬ArrayList集合自定義一個集合MyArrayList集合,完成新增和刪除功能的泛型設計即可。

問題1:泛型類的核心思想?

把出現泛型變數的地方全部替換成傳輸的真實資料型別

問題2:泛型類的作用?

編譯階段約定操作的資料的型別,類似於集合的作用。

自定義泛型方法

泛型方法的概述

定義方法時同時定義了  泛型的方法  就是  泛型方法。
泛型方法的格式:修飾符 <泛型變數> 方法返回值 方法名稱(形參列表){}
範例: public <T> void show(T t) {    // <T>表示引數的型別,一般在public或者static的後面 
            }
作用:方法中可以使用泛型接收一切實際型別的引數,方法更具備通用性。

課程案例導學

給你任何一個型別的陣列,都能返回它的內容。也就是實現Arrays.toString(陣列)的功能!

public class GeneticDemo {
    public static void main(String[] args) {
        String[] names = {"lushimeng", "yangyinyu", "wangliang", "xigua", "xiangjia"};
        printArray(names);  // 把printArray方法中出現泛型的地方全部變化為String型別
        Character[] character = {'2', 'd', 'd', 'r'};
        printArray(character);  // 把printArray方法中出現泛型的地方全部變化為Character型別
        Integer[] ages = {23, 435, 56, 67, 67};
        printArray(ages);  // 把printArray方法中出現泛型的地方全部變化為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的鏈式程式設計
            }
            sb.append("]");
            System.out.println(sb);
        }else{
            System.out.println(array);
        }
    }
}

問題1、泛型方法的核心思想:

把出現泛型變數的地方  全部替換   成傳輸的真實資料型別

問題2、泛型方法的作用

方法中可以使用泛型接收一   切實際型別的引數,方法更具備通用性

自定義泛型介面

泛型介面的概述

使用了泛型定義的介面就是泛型介面。
泛型介面的格式:修飾符 interface 介面名稱<泛型變數>{
                           }
範例: public interface Data<E>{}

課程案例導學

教務系統,提供一個介面可約束一定要完成資料(學生,老師)的增刪改查操作

問題1、泛型介面的作用

泛型介面可以約束實現類,實現類可以在實現介面的時候傳入自己操作的資料型別這樣重寫的方法都將是針對於該型別的操作。

泛型萬用字元、上下限

萬用字元:?

?   可以在「使用泛型」的時候代表     一切型別。
 E T K V 是在定義   泛型    的時候使用的。

泛型萬用字元:案例導學

開發一個極品飛車的遊戲,所有的汽車都能一起參與比賽。
特別注意:雖然BMW和BENZ都繼承了Car但是ArrayList<BMW>和ArrayList<BENZ>與ArrayList<Car>沒有關係的!!
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的子類都可以傳入進去

        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{
}

泛型的上下限:

?   可以在「使用泛型」的時候代表     一切型別。
 ? extends Car: ?必須是Car或者其子類     泛型上限
 ? super Car : ?必須是Car或者其父類別     泛型下限

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!


IT145.com E-mail:sddin#qq.com