溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的泛型怎么理解

發(fā)布時(shí)間:2022-05-18 17:40:50 來源:億速云 閱讀:153 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“Java中的泛型怎么理解”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Java中的泛型怎么理解

  • 泛型:是JDK5中引入的特性,可以在編譯階段約束操作的數(shù)據(jù)類型,并進(jìn)行檢查。

  • 泛型的格式:<數(shù)據(jù)類型>,注意:泛型只能支持引用數(shù)據(jù)類型。

  • 集合體系的全部接口和實(shí)現(xiàn)類都是支持泛型的使用的。

優(yōu)點(diǎn):

  • 統(tǒng)一數(shù)據(jù)類型。

  • 把運(yùn)行的問題提前到編譯期間,避免了強(qiáng)制類型轉(zhuǎn)換可能出現(xiàn)的問題,因?yàn)榫幾g階段類型便可以確定下來。

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("石原里美");
        list.add("工藤靜香");
        list.add("朱茵");
        for (String s : list) {
            System.out.println(s);
        }
    }
輸出結(jié)果:
石原里美
工藤靜香
朱茵

并且泛型還可以在很多地方進(jìn)行定義,比如在類后面就是泛型類、方法聲明上就是泛型方法、接口后面就是泛型接口。接下來我們共同來學(xué)習(xí)一下這些泛型是如何使用的:

自定義泛型類

概念

  • 定義類的同時(shí)定義了泛型的類就是泛型類。

  • 泛型類的格式:修飾符 class 類名<泛型變量> {        }

public class MyArrayList<E>{    }
  • 作用:編譯階段可以指定數(shù)據(jù)類型,類似于集合的作用

實(shí)戰(zhàn)教學(xué)

現(xiàn)創(chuàng)建一個(gè)泛型類,實(shí)現(xiàn)基本的增加、刪除操作,以此來具體了解其用法:

//泛型類MyArrayLIst
public class MyArrayLIst<E> {
    public void add(E e){

    }
    public void remove(E e){

    }
}
//main
public static void main(String[] args) {
        MyArrayLIst<String> list = new MyArrayLIst<>();
        //通過對(duì)泛型的設(shè)定,實(shí)現(xiàn)對(duì)數(shù)據(jù)專一處理
        list.add("石原里美");
        list.add("工藤靜香");
        list.remove("工藤靜香");
    }

泛型類的原理:

把出現(xiàn)泛型變量的地方全部替換成傳輸?shù)恼鎸?shí)的數(shù)據(jù)類型。

通過認(rèn)真觀察,其實(shí)不難去發(fā)現(xiàn),泛型類與普通類的最大區(qū)別在于在調(diào)用方法的時(shí)候可以統(tǒng)一的對(duì)同一種數(shù)據(jù)進(jìn)行處理,不會(huì)涉及到其他的數(shù)據(jù)類型,從一定程度上避免了強(qiáng)制類型轉(zhuǎn)化時(shí)可能會(huì)出現(xiàn)的問題。

Java中的泛型怎么理解

自定義泛型方法

概念

  • 定義方法的同時(shí)定義了泛型的方法就是泛型方法。

  • 泛型方法的格式:修飾符<泛型變量> 返回值類型 方法名(形參列表){        }

public <E> void view(E e){    }
  • 作用:方法中可以使用泛型接收一切實(shí)際類型的參數(shù),方法更具備通用性。

  • 注意:泛型方法需要區(qū)別于泛型類中所定義的方法,雖然它們也在使用泛型,但是該泛型不是其定義的,而是泛型類定義的。

實(shí)戰(zhàn)教學(xué)

無論傳入何種類型的數(shù)組,都可以返回它的內(nèi)容,即實(shí)現(xiàn)Arrays.toString()的作用

public static void main(String[] args) {
        String [] name = {"石原里美","工藤靜香","朱茵"};
        view(name);
        Integer [] age = {18,19,20};
        view(age);
    }
    public static  <T> void view(T[] arr){
        StringBuilder list = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            list.append(arr[i]).append("\t");
        }
        System.out.println(list);
    }

通過實(shí)現(xiàn)對(duì)泛型方法的定義,可以實(shí)現(xiàn)多種數(shù)據(jù)類型的接收,應(yīng)用范圍更加廣泛。

自定義泛型接口

概念

  • 使用泛型定義的接口就是泛型接口。

  • 泛型接口的格式:public interface People<E>{        }

public interface People <E>{    }
  • 作用:泛型接口可以讓實(shí)現(xiàn)類選擇當(dāng)前功能需要操作的數(shù)據(jù)類型

實(shí)戰(zhàn)教學(xué)

定義一個(gè)People接口,實(shí)現(xiàn)對(duì)老師Teacher類、學(xué)生Student等類的操作

//People接口
public interface People <E>{
    void run(E e);
    void height(E e);
}
//Student類
public class Teacher {

}
//實(shí)現(xiàn)類Fantype
public class Fantype implements People<Teacher> {

    @Override
    public void run(Teacher teacher) {

    }

    @Override
    public void height(Teacher teacher) {

    }
}

通過對(duì)上述代碼的觀察,可以發(fā)現(xiàn),People后定義的是什么類型,那么該實(shí)現(xiàn)類只能對(duì)該種數(shù)據(jù)類型進(jìn)行操作,其他類型不可以進(jìn)行此操作。

通配符和上下限

通配符

  • ?可以在“使用泛型”的時(shí)候代表一切類型

  • E T K V是在定義泛型的時(shí)候用的

假設(shè)現(xiàn)在有一場(chǎng)為學(xué)生和老師而舉辦的比賽,需要比較速度究竟誰更快,分別創(chuàng)建一定數(shù)量的對(duì)象并將其傳入集合之中。然而當(dāng)我們將這兩個(gè)集合分別傳入方法中的時(shí)候,會(huì)發(fā)現(xiàn),學(xué)生對(duì)象集合list2出現(xiàn)報(bào)錯(cuò),為什么呢?原因是因?yàn)閿?shù)據(jù)類型不同,那么該如何使得兩種類型都可以傳入呢?或許這個(gè)時(shí)候就會(huì)有人說了:“既然兩個(gè)類都是People的子類,那么為什么不定義它的泛型是People呢?”這個(gè)想法很好,但是我們需要明確一點(diǎn)的是子類與父類雖然是有關(guān)系的,但是定義之后的集合是沒有關(guān)系的,所以這里是行不通的。

//main
//老師對(duì)象集合
ArrayList<Teacher> list1 = new ArrayList<>();
list1.add(new Teacher());
list1.add(new Teacher());
pk(list1);
//學(xué)生對(duì)象集合
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new student());
list2.add(new student());
pk(list2);//由于pk方法的形參是泛型為Teacher的集合,所以會(huì)報(bào)錯(cuò)
//父類
class People{

    }
//子類
class Teacher extends People{

    }
class student extends People{

    }
//pk方法:
public static void pk(ArrayList<Teacher> people){
}

應(yīng)對(duì)這個(gè)問題,我們可以便可以將本篇文章引入的知識(shí)“通配符”放在實(shí)際應(yīng)用中解決問題了,通過其簡(jiǎn)短的概念“?可以在‘使用泛型’的時(shí)候代表一切類型”就可以理解其作用了,這里我們可以使用“?”共同代表兩種類型。

public static void pk(ArrayList<?> people){
//通過通配符?便可以將這個(gè)問題解決掉
    }

上下限

然而此時(shí)又出現(xiàn)一個(gè)問題,定義了一個(gè)dog類,試圖創(chuàng)建一些對(duì)象并傳入集合中混入比賽,這種當(dāng)然情況當(dāng)然是不允許發(fā)生的,然而?是可以表示任意類型的,并不能對(duì)其進(jìn)行限制。因此上下限的作用就體現(xiàn)出來了:

  • 上限:<? extends 父類>,傳入類型必須是該父類或者是父類的子類

  • 下限:<? super 子類>,傳入類型必須是該子類或者是子類的父類

public static void pk(ArrayList<? extends People> people){
//通過上下限便可以將這個(gè)問題解決掉
//要求傳入的類型必須是People的子類才可以
    }

“Java中的泛型怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI