Java泛型

1、定義

泛型,即“參數(shù)化類型”。一提到參數(shù),最熟悉的就是定義方法時(shí)有形參,然后調(diào)用此方法時(shí)傳遞實(shí)參。那么參數(shù)化類型怎么理解呢?

顧名思義,就是將類型由原來(lái)的具體的類型參數(shù)化,類似于方法中的變量參數(shù),此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參)。

泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下,通過(guò)泛型指定的不同類型來(lái)控制形參具體限制的類型)。也就是說(shuō)在泛型使用過(guò)程中,操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。

2、栗子

舉個(gè)眾人皆知的例子:

public static void main(String[] args) {
    List list = new ArrayList();
    list.add("asdf");
    list.add(123);

    // TODO Auto-generated method stub
    for (int i = 0; i < list.size(); i++) {
        System.out.println("list.get[" + i + "] == " + (String)list.get(i));
    }
}

編譯時(shí)不會(huì)報(bào)錯(cuò),但是一旦運(yùn)行,程序就會(huì)崩潰,報(bào)錯(cuò)如下:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

例子中添加了一個(gè)String類型,添加了一個(gè)Integer類型,再使用時(shí)都以String的方式使用,因此程序崩潰了。為了解決類似這樣的問(wèn)題(在編譯階段就可以解決),泛型應(yīng)運(yùn)而生。
我們?cè)诔跏蓟痩ist的時(shí)候就指定類型,編譯器就能在編譯階段幫我們發(fā)現(xiàn)類似問(wèn)題;

public static void main(String[] args) {
    List<String> list = new ArrayList();//為list指定String類型
    list.add("asdf");
    list.add(123);//添加int型數(shù)據(jù)就會(huì)報(bào)錯(cuò),編譯無(wú)法通過(guò),避免運(yùn)行時(shí)崩潰

    // TODO Auto-generated method stub
    for (int i = 0; i < list.size(); i++) {
        System.out.println("list.get[" + i + "] == " + (String)list.get(i));
    }
}

3、泛型擦除

泛型只在編譯階段有效;

public static void main(String[] args) {
    List<String> stringList = new ArrayList<String>();
    List<Integer> integerList = new ArrayList<Integer>();

    Class classStringArrayList = stringList.getClass();
    Class classIntegerArrayList = integerList.getClass();

    if(classStringArrayList.equals(classIntegerArrayList)){
        System.out.println("泛型相同");
    }
}

運(yùn)行結(jié)果:泛型相同;
通過(guò)上面的例子可以證明,在編譯之后程序會(huì)采取去泛型化的措施。也就是說(shuō)Java中的泛型,只在編譯階段有效。在編譯過(guò)程中,正確檢驗(yàn)泛型結(jié)果后,會(huì)將泛型的相關(guān)信息擦除,并且在對(duì)象進(jìn)入和離開(kāi)方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法。也就是說(shuō),泛型信息不會(huì)進(jìn)入到運(yùn)行時(shí)階段。

對(duì)此總結(jié)成一句話:泛型類型在邏輯上看以看成是多個(gè)不同的類型,實(shí)際上都是相同的基本類型。

4、使用

泛型有三種使用方式,分別為:泛型類、泛型接口、泛型方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容