最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 深入淺出講解泛型與包裝類

 更新時間:2022年04月02日 10:03:42   作者:Pretend..  
泛型是在Java SE 1.5引入的的新特性,本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法,本篇我們一起來學(xué)習(xí)泛型以及包裝類

1、什么是泛型

泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下,通過泛型指定的不同類型來控制形參具體限制的類型)。

先看以下的例子:

我們以前學(xué)過的數(shù)組,只能存放指定類型的元素。如:int[] array=new int[10];String[] array=new String[10];而Object類是所有類的父類,那么我們是否可以創(chuàng)建Obj數(shù)組呢?

class Myarray{
    public Object[] array=new Object[10];
    public void setVal(int pos,Object val){
        this.array[pos]=val;
    }
    public Object getPos(int pos){
        return this.array[pos];
    }
}
public class TestDemo{
    public static void main(String[] args) {
        Myarray myarray=new Myarray();
        myarray.setVal(1,0);
        myarray.setVal(2,"shduie");//字符串也可以存放
        String ret=(String)myarray.getPos(2);//雖然我們知道它是字符串類型,但是還是要強制類型轉(zhuǎn)換
        System.out.println(ret);
    }
}

以上代碼實現(xiàn)后,我們發(fā)現(xiàn):

  • 任何類型的數(shù)據(jù)都能存放
  • 2號下標(biāo)本來就是字符串,但是必須進(jìn)行強制類型轉(zhuǎn)換

以此引出泛型,泛型的目的就是:指定當(dāng)前的容器要持有什么類型的對象,讓編譯器自己去檢查。

2、泛型的語法

class 泛型類名稱< 類型形參列表>{

  //這里可以使用類型參數(shù)

}

泛型的使用:

泛型類<類型實參> 變量名=new 泛型類<類型實參>(構(gòu)造方法實參)

MyArray  list=new MyArray<>();

【注】

  • 類型后的<>代表占位符,表示當(dāng)前類是一個泛型類
  • 在實例化泛型時,<>中不能是簡單的類型,需要是包裝類
  • <>不參與泛型的類型組成
  • 不能new泛型類型的數(shù)組
  • 使用泛型不需要進(jìn)行強制類型轉(zhuǎn)換

一個簡單的泛型:

//此處T可以隨便寫為任意標(biāo)識,常見的如T、E、K、V等形式的參數(shù)常用于表示泛型
//在實例化泛型類時,必須指定T的具體類型
public class Test<T>{ 
    //key這個成員變量的類型為T,T的類型由外部指定  
   private T key;
 
    public Test(T key) { //泛型構(gòu)造方法形參key的類型也為T,T的類型由外部指定
        this.key = key;
    }
 
    public T getKey(){ //泛型方法getKey的返回值類型為T,T的類型由外部指定
        return key;
    }
}

擦除機制:編譯時會將<>中的類型擦除掉,所以<>中的東西不參與類型的組成。會將T擦除為Object。

為什么不能實例化泛型類型的數(shù)組?

數(shù)組和泛型之間的一個重要區(qū)別是它們?nèi)绾螐娭茍?zhí)行類型檢查。數(shù)組在運行時存儲和檢查類型信息,而泛型是在編譯時檢查類型錯誤。

返回的Object數(shù)組里面,可能存放著任何類型的數(shù)據(jù),如string,通過int類型的數(shù)組來接收,編譯器認(rèn)為是不安全的。

3、泛型的上界

語法:

class 泛型類名稱<T extends  類型邊界>{

}

例:

public class MyArray{} //E只能是Number或Number的子類

public class MyArray<E extends Comparable<E>>{}

//E一定實現(xiàn)了Comparable接口的類

【注】沒有指定邊界的E,可以看作 E extends Object

4、通配符

? 用于在泛型的使用,即為通配符。通配符用來解決反泛型無法協(xié)變的問題。

如下兩段代碼:

代碼一:
public static<T> void printList1(ArrayList<T> list){
   for(T x:list){
      System.out.println(x);
   }
}
 
代碼二:
public static<T> void printList2(ArrayList<?> list){
   for(Object x:list){
      System.out.println(x);
   }
}

代碼2中使用了通配符,和代碼1相比,此時傳入代碼1的具體是什么數(shù)據(jù)類型,我們是不清楚的。

(1)通配符的上界

語法:

<? extends 上界>

<? extends Number>//可以傳入的實參類型為Number或Number的子類

例:對于以下關(guān)系,我們需要寫一個方法來打印存儲了Animal或者Animal子類的list。

Animal
Cat extends Animal
Dog extends Animal

代碼一:

public static <t extends Animal> void print1(List<T> list>{
    for(T animal:list){
        System.out.println(animal);//調(diào)用了T的toString
    }
}

此時T類型是Animal的子類或自己。

代碼二:通過通配符實現(xiàn)

public static void print2(List<? extends Animal> list){
    for(Animal animal:list){
       Syatem.out.println(animal);//調(diào)用了子類的toString方法
    }
}

兩種代碼的區(qū)別:

  • 對于泛型實現(xiàn)的方法來說,<T extends Animal>對T進(jìn)行了限制,只能是Animal的子類。傳入Cat,就是Cat。
  • 對于通配符實現(xiàn)的方法來說,相當(dāng)于對Animal進(jìn)行了規(guī)定,允許傳入Animal的子類。具體哪個子類,此時并不清楚。如:傳入Cat,實際上聲明的類型是Animal,使用多態(tài)才能調(diào)用Cat的toString方法

通配符上界→父子類關(guān)系:

//需要使用通配符來確定父子類型

MyArrayList<? extends Number>是MyArrayList<Integer>或者M(jìn)yArrayList<Double>的父類

MyArrayList<?>是MyArrayList<? extends Number>的父類

 ArrayList<Integer> arrayList1 = new ArrayList<>();
 ArrayList<Double> arrayList2 = new ArrayList<>();
 List<? extends Number> list = arrayList1;
 //list.add(1,1);//報錯,此時list的引用的子類對象有很多,再添加的時候,任何子類型都可以,為了安全,java不讓這樣進(jìn)行添加操作。
 Number a = list.get(0);//可以通過
 Integer i = list.get(0);//編譯錯誤,只能確定是Number子類

【注】

  • 不能對其進(jìn)行添加,list中存儲的可能是Number也可能是Number的子類,無法確定類型。
  • 通配符上界適合讀取,不適合寫入。

(2)通配符的下界

語法:

<? super 下界>

<? super Integer>//可以傳入的參數(shù)類型是Integer或者Integer的父類

通配符下界的父子類關(guān)系:

MyArrayList<? super Integer>是MyArrayList<Intrger>的父類類型

MyArrayList<?>是MyArrayList<? super Integer>的父類

通配符下界適合寫入元素,不適合讀取。

5、包裝類

在Java中,由于基本類型不是繼承自O(shè)bject,為了在泛型中可以支持基本類型,每個基本類型都對應(yīng)了一個包裝類。除了Integer和Character,其余基本類型的包裝類都是首字母大寫。

拆箱和裝箱:

int i=10;
 
//裝箱操作,新建一個Integer類型對象,將i的值放入對象的某個屬性中
Integer ii=i;  //自動裝箱
//Integer ii=Integer.valueOf(i);
Integer ij= new Integer(i);//顯示裝箱
 
//拆箱操作,將Integer對象中的值取出,放到一個基本數(shù)據(jù)類型中
int j=ii.intValue();//顯示的拆箱
int jj=ii;//隱式的拆箱

 

到此這篇關(guān)于Java 深入淺出講解泛型與包裝類的文章就介紹到這了,更多相關(guān)Java 泛型 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java線程池實現(xiàn)批量下載文件

    java線程池實現(xiàn)批量下載文件

    這篇文章主要為大家詳細(xì)介紹了java線程池實現(xiàn)批量下載文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java基礎(chǔ)題新手練習(xí)(二)

    Java基礎(chǔ)題新手練習(xí)(二)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • JAVA 生成隨機數(shù)并根據(jù)后臺概率靈活生成的實例代碼

    JAVA 生成隨機數(shù)并根據(jù)后臺概率靈活生成的實例代碼

    本篇文章主要介紹了JAVA 生成隨機數(shù)并根據(jù)后臺概率靈活生成的實例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • sublime編譯器怎么運行java程序

    sublime編譯器怎么運行java程序

    Sublime是一款強大的代碼編輯器,它提供了豐富的功能和插件,可以幫助開發(fā)者提高代碼的編寫效率和質(zhì)量,通過安裝相關(guān)插件和進(jìn)行簡單配置,我們可以輕松地在Sublime中編譯和運行Java代碼,下面我們將詳細(xì)介紹如何配置Sublime,使其能夠高效地運行Java代碼
    2024-06-06
  • Java并發(fā)編程之CountDownLatch源碼解析

    Java并發(fā)編程之CountDownLatch源碼解析

    這篇文章主要介紹了Java并發(fā)編程之CountDownLatch源碼解析,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java并發(fā)編程的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • springboot多環(huán)境配置方案(不用5分鐘)

    springboot多環(huán)境配置方案(不用5分鐘)

    這篇文章主要介紹了springboot多環(huán)境配置方案(不用5分鐘),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 詳解Spring中的Environment外部化配置管理

    詳解Spring中的Environment外部化配置管理

    本文主要介紹了Spring中的Environment外部化配置管理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • maven項目打包如何去掉不需要的module

    maven項目打包如何去掉不需要的module

    文章總結(jié):在my-project工程依賴my-core和my-common,且my-project在總工程AAA中時,建議通過以下兩種方案優(yōu)化打包流程:1.?使用pom區(qū)分,重新編寫pom文件,并指定需要重新編譯的工程到modules中,然后在編譯時指定pom文件;
    2024-12-12
  • Java實現(xiàn)AES算法的實例代碼

    Java實現(xiàn)AES算法的實例代碼

    高級加密標(biāo)準(zhǔn)(AES,Advanced?Encryption?Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的),本文重點給大家介紹Java實現(xiàn)AES算法的實例代碼,感興趣的朋友一起看看吧
    2022-02-02
  • IntelliJ IDEA導(dǎo)入Gradle項目的方法

    IntelliJ IDEA導(dǎo)入Gradle項目的方法

    這篇文章主要介紹了IntelliJ IDEA導(dǎo)入Gradle項目的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

锡林郭勒盟| 内丘县| 东莞市| 临沭县| 宁海县| 延边| 镇江市| 瑞丽市| 贵溪市| 大埔区| 丰城市| 南澳县| 汕头市| 宁南县| 正宁县| 曲阳县| 淮安市| 厦门市| 松滋市| 广饶县| 达日县| 昭苏县| 特克斯县| 中卫市| 乌鲁木齐县| 仁怀市| 天全县| 阳朔县| 大埔县| 鹿邑县| 邵武市| 亳州市| 张北县| 乃东县| 九龙坡区| 南木林县| 罗甸县| 利辛县| 清水河县| 白朗县| 寿宁县|