国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界)

這篇具有很好參考價值的文章主要介紹了詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界),Java_SE,java,開發(fā)語言,jvm,經(jīng)驗分享


目錄

一.什么是泛型

二.Java中為什么要使用泛型

三.泛型的語法

四.泛型類的使用

五.泛型的編譯機制(擦除機制)

六.泛型的上界


一.什么是泛型

泛型(Generics)是Java SE 5中引入的一個新特性,可以使Java中的類和方法具有更廣泛的類型范圍。通俗的說,它使得我們可以在定義類和方法時指定一個或多個類型參數(shù),從而可以在不考慮具體類型的情況下,代碼中直接使用這些類型參數(shù)。泛型可以增強代碼的安全性、可讀性和可重用性。例如,可以使用泛型實現(xiàn)容器類(如ArrayList、HashMap)等。在使用泛型時,需要在編寫代碼時指定泛型類型,這樣可以在編譯期間檢查代碼的類型安全性。

二.Java中為什么要使用泛型

一般的類和方法,只能使用具體的類型::要么是基本類型,要么是自定義的類。如果要編寫可以應(yīng)用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。

----- 來源《Java編程思想》對泛型的介紹

Java中的泛型是一種允許在編寫代碼時指定類型參數(shù)的能力。使用泛型可以使代碼更加通用且類型安全。通過使用泛型,程序員可以編寫一個方法或類,該方法或類在實例化時可以接受不同類型的參數(shù)。泛型是將數(shù)據(jù)類型參數(shù)化,進行傳遞這樣可以減少代碼的重復(fù),并提高代碼的可讀性和可維護性。

假如我們要實現(xiàn)一個數(shù)組,使得其中能夠存放任意數(shù)據(jù)類型的元素,想存放整形,又想存放字符型,又想存放引用型該怎么辦呢?我們可以聯(lián)想一下之前認識過的Object類,Object類是所有類的父類,那我們將數(shù)組置為Object類可以嗎?

class MyArray {
    public Object[] array = new Object[10];
    public Object getPos(int pos) {
        return this.array[pos];
    }
    public void setVal(int pos,Object val) {
        this.array[pos] = val;
    }
}
    public static void main(String[] args) {
        MyArray myArray = new MyArray();
        myArray.setVal(0, 10);//整形可以存放
        myArray.setVal(1, "hello");//字符串也可以存放
        String ret = myArray.getPos(1);//編譯報錯,原因是因為我們數(shù)組的類型是Object類型
        //但是我們這里接收的元素卻是String類型
        //也就是說我們相當(dāng)于進行了向下轉(zhuǎn)型,所以這里會報錯
        //如果我們進行強制轉(zhuǎn)化就可以解決這個問題
        //String ret = (String) myArray.getPos(1);
        System.out.println(ret);
    }

?我們會發(fā)現(xiàn)在這種情況下,整體的語法其實是不靈活的,雖然當(dāng)前數(shù)組任何數(shù)據(jù)都可以存放,但是更多情況下,我們還是希望他只能夠持有一種數(shù)據(jù)類型,而不是同時持有這么多類型。

所以泛型的主要目的就是指定當(dāng)前的容器,要持有什么類型的對象,讓編譯器去做檢查。此時就需要把類型作為參數(shù)傳遞需要什么類型,就傳入什么類型。

三.泛型的語法

在充分認識了泛型的必要性和作用后,我們來看看如何使用它:在Java中,泛型的使用方式是通過在類名或方法名后面加上尖括號,然后在尖括號里指定類型參數(shù)。具體語法如下:

class 泛型類名稱<類型形參列表> {
    // 這里可以使用類型參數(shù)
}
class ClassName<T1, T2, ..., Tn> {
}
class 泛型類名稱<類型形參列表> extends 繼承類/* 這里可以使用類型參數(shù) */ {
    // 這里可以使用類型參數(shù)
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
    // 可以只使用部分類型參數(shù)
}

可以通過泛型實例化一個泛型對象

泛型類<類型實參> 變量名; // 定義一個泛型類引用
new 泛型類<類型實參>(構(gòu)造方法實參); // 實例化一個泛型類對象

MyArray<Integer> list = new MyArray<Integer>();

當(dāng)編譯器可以根據(jù)上下文推導(dǎo)出類型實參時,可以省略類型實參的填寫

MyArray<Integer> list = new MyArray<>(); // 可以推導(dǎo)出實例化需要的類型實參為 Integer

泛型只能接受類,所有的基本數(shù)據(jù)類型必須使用包裝類?

四.泛型類的使用

對于我們剛才的數(shù)組,我們就可以如下設(shè)置為一個泛型數(shù)組

class MyArray<T> {
    public T[] array = (T[])new Object[10];//1
    //public T[] array;
    public T getPos(int pos) {
        return this.array[pos];
    }
    public void setVal(int pos,T val) {
        this.array[pos] = val;
    }
}
    public static void main(String[] args) {
        MyArray<Integer> myArray1 = new MyArray<>();//2
        myArray1.setVal(0,10);
        myArray1.setVal(1,12);
        
        MyArray<String> myArray2 = new MyArray<>();//3
        myArray2.setVal(0,"hello");
        myArray2.setVal(1,"world");
        
        MyArray<Float> myArray3 = new MyArray<>();//4
        myArray3.setVal(0,1.23f);
        myArray3.setVal(1,3.14f);
    }

在上述代碼塊中

類名后的 <T> 代表占位符,表示當(dāng)前類是一個泛型類,常用的其他名稱有:

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V 等等... ...

注釋1處,不能new泛型類型的數(shù)組,也就是說下面這樣的代碼是錯誤的

T[] arrary = new T[5];//是不對的

注釋2處,類型后加入 <Integer> 指定當(dāng)前類型,注釋3,4處同理

五.泛型的編譯機制(擦除機制)

Java的類型擦除機制是指在編譯期間將泛型的類型參數(shù)替換為其邊界或Object類型,從而實現(xiàn)泛型代碼運行時無需知曉實際類型參數(shù),也就是說泛型的類型參數(shù)在運行時是被擦除了的。這個機制是為了兼容Java語言的舊版本,同時也可以減少代碼重復(fù),使得代碼更加簡潔。

舉個例子來說,:

????????假如有一個泛型類List<T>,其中的T可以指定任何類型,但是在運行時,List<T>的實際類型是List<Object>。那么,當(dāng)我們在使用List<T>時,編譯器會自動擦除類型參數(shù)T,然后將List<T>替換為List<Object>,這樣就可以在運行時使用Object類型來處理元素。

????????在編譯期間,泛型類型參數(shù)String被擦除了,List<String>被替換成了List<Object>,而在運行時,get方法返回的是Object類型,需要強制轉(zhuǎn)換為String類型,也就是說,我們無法在運行時獲取到類型參數(shù)的具體值,因為編譯器已經(jīng)將其擦除了。

泛型到底是如何進行編譯的?這曾經(jīng)作為面試題進行考察過,泛型的語法實際上是非常復(fù)雜不容易理解的,我們需要借助他的字節(jié)碼文件去觀察,使用命令:javap -c 查看字節(jié)碼文件

詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界),Java_SE,java,開發(fā)語言,jvm,經(jīng)驗分享

也就是說在編譯的過程當(dāng)中,將所有的T替換為Object這種機制,我們稱為:擦除機制

這個類型擦除機制也給開發(fā)帶來了一些限制和挑戰(zhàn),比如不能在運行時獲取泛型參數(shù)的具體類型,泛型數(shù)組的創(chuàng)建受到限制等。但是通過一些技巧和設(shè)計模式,我們可以在一定程度上繞過這些限制,讓代碼更加靈活和可擴展。

六.泛型的上界

在定義泛型類時,有時需要對傳入的類型變量做一定的約束,可以通過類型邊界來約束,語法:

class 泛型類名稱<類型形參 extends 類型邊界> {
    //... ...
}

例如:

public class MyClass<T extends MyClass2> {
    // ...
}

上述代碼中,泛型類型T的上界是MyClass2,這意味著在使用MyClass時,只能傳入MyClass2或其子類作為T的實際類型參數(shù)。這樣做可以確保在類型安全的前提下,使用泛型類型時具有更大的靈活性和可擴展性。

假設(shè)我們有一個泛型類Box<T>,我們希望確保這個類型參數(shù)T必須是實現(xiàn)了Comparable接口的類。我們可以使用泛型的上界<T extends Comparable<T>>來實現(xiàn)這個目標(biāo),示例代碼如下:

public class Box<T extends Comparable<T>> {
    private T value;

    public Box(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public boolean isGreaterThan(Box<T> otherBox) {
        return value.compareTo(otherBox.getValue()) > 0;
    }
}

在這個示例中,我們使用<T extends Comparable<T>>來定義類型參數(shù)上界,確保T必須是實現(xiàn)了Comparable接口的類。這樣,我們就可以在isGreaterThan()方法中使用value.compareTo()方法來比較value字段和另一個Box對象的值了。




?詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界),Java_SE,java,開發(fā)語言,jvm,經(jīng)驗分享?本次的分享就到此為止了,希望我的分享能給您帶來幫助,也歡迎大家三連支持,你們的點贊就是博主更新最大的動力!詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界),Java_SE,java,開發(fā)語言,jvm,經(jīng)驗分享如有不同意見,歡迎評論區(qū)積極討論交流,讓我們一起學(xué)習(xí)進步!詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界),Java_SE,java,開發(fā)語言,jvm,經(jīng)驗分享有相關(guān)問題也可以私信博主,評論區(qū)和私信都會認真查看的,我們下次再見詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界),Java_SE,java,開發(fā)語言,jvm,經(jīng)驗分享文章來源地址http://www.zghlxwxcb.cn/news/detail-752654.html

到了這里,關(guān)于詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • java的泛型【詳解】

    java的泛型【詳解】

    定義類、接口、方法時,同時聲明了一個或者多個類型變量(如:E) ,稱為泛型類、泛型接口,泛型方法、它們統(tǒng)稱為泛型。 作用:泛型提供了在編譯階段約束所能操作的數(shù)據(jù)類型,并自動進行檢查的能力!這樣可以避免強制類型轉(zhuǎn)換,及其可能出現(xiàn)的異常。 1.泛型類:

    2024年02月19日
    瀏覽(18)
  • Java 中的泛型是什么,它有什么作用?(十五)

    Java中的泛型是一種類型參數(shù)化機制,它使代碼更具可讀性、可重用性和穩(wěn)健性。在Java中,通過使用泛型,可以將類型作為參數(shù)傳遞給類或方法,并在編譯時執(zhí)行類型檢查,從而避免許多運行時錯誤。 泛型的基礎(chǔ) Java泛型的基礎(chǔ)概念是類型變量、類型參數(shù)和類型邊界。 類型變

    2024年02月03日
    瀏覽(26)
  • 第8章-第1節(jié)-Java中的泛型(參數(shù)化類型)

    1、泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計模式中有非常廣泛的應(yīng)用。什么是泛型?為什么要使用泛型? 2、概念:在類聲明體中用到了類型參數(shù)。 3、泛型類只支持類類型,不支持基本數(shù)據(jù)類型(如int),但可以用包裝類(如Integer ) 泛型標(biāo)識 含義 T Type 類

    2024年01月23日
    瀏覽(24)
  • TypeScript中的泛型(泛型函數(shù)、接口、類、泛型約束)

    一、泛型函數(shù) TypeScript 泛型是一種可以使代碼具有更高的可重用性和泛化能力的特性 。通過泛型,我們可以定義一種通用的類型或函數(shù),使其能夠應(yīng)對多種類型的輸入。泛型在類、函數(shù)、接口等多種場景下都可以使用。 具體來說,在定義泛型函數(shù)時,我們可以使用來表示一

    2024年02月11日
    瀏覽(23)
  • 【TypeScript】TypeScript中的泛型

    定義一個函數(shù)或類時,有些情況下無法確定其中要使用的具體類型(返回值、參數(shù)、屬性的類型不能確定),此時泛型便能夠發(fā)揮作用。 舉個例子: 上例中,test函數(shù)有一個參數(shù)類型不確定,但是能確定的時其返回值的類型和參數(shù)的類型是相同的,由于類型不確定所以參數(shù)和

    2024年02月09日
    瀏覽(29)
  • C++中的泛型詳細講解

    它是一種泛化的編程方式,其實現(xiàn)原理為程序員編寫一個函數(shù)/類的代碼示例,讓編譯器去填補出不同的函數(shù)實現(xiàn)。允許您延遲編寫類或方法中的編程元素的數(shù)據(jù)類型的規(guī)范,直到實際在程序中使用它的時候。換句話說,泛型允許您編寫一個可以與任何數(shù)據(jù)類型一起工作的類或

    2024年02月12日
    瀏覽(30)
  • python中的泛型使用TypeVar

    PEP484的作者希望借助typing模塊引入類型提示,不改動語言的其它部分。通過精巧的元編程技術(shù),讓類支持[]運算不成問題。但是方括號內(nèi)的T變量必須在某處定義,否則要大范圍改動python解釋器才能讓泛型支持特殊的[]表示法。 鑒于此,我們增加了typing.TypeVar構(gòu)造函數(shù),把變量

    2024年02月04日
    瀏覽(25)
  • Kotlin中的泛型理解與應(yīng)用

    泛型是一種在編程中用于增加代碼的靈活性和重用性的概念。它允許我們編寫可以在多種類型上工作的通用代碼,而不需要為每種類型都編寫不同的代碼。 在Kotlin中,泛型可以應(yīng)用于類、函數(shù)和接口等。下面是一些關(guān)于泛型在Kotlin中的理解和示例。 1、泛型類 泛型類是指可以

    2024年02月07日
    瀏覽(24)
  • Java的泛型

    Java的泛型

    泛型是我們需要的程序設(shè)計手段。使用泛型機制編寫的程序代碼要比那些雜亂地使用 Object 變量,然后再進行強制類型轉(zhuǎn)換的代碼具有更好的安全性和可讀性。 至少在表面上看來,泛型很像 C++ 中的模板。與 Java —樣,在 C++ 中,模板也是最先被添加到語言中支持強類型集合的

    2024年02月08日
    瀏覽(21)
  • 【Java】 泛型擦除

    【Java】 泛型擦除

    原因一:JDK1.5及1.5之前都是沒有泛型的概念的,JDK1.5之后引入了泛型的概念并為了與之前的JDK版本兼容,所以引入了泛型擦除的概念。 原因二:若對每個泛型類型都生成不同的目標(biāo)代碼,現(xiàn)有10個不同泛型的List,就要生成10份字節(jié)碼,這樣會造成不僅造成代碼膨脹,而且一份

    2024年01月23日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包