91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java泛型與包裝類實例分析

發布時間:2022-04-02 11:03:14 來源:億速云 閱讀:147 作者:iii 欄目:開發技術

今天小編給大家分享一下Java泛型與包裝類實例分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1、什么是泛型

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

先看以下的例子:

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

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);//雖然我們知道它是字符串類型,但是還是要強制類型轉換
        System.out.println(ret);
    }
}

以上代碼實現后,我們發現:

  • 任何類型的數據都能存放

  • 2號下標本來就是字符串,但是必須進行強制類型轉換

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

2、泛型的語法

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

  //這里可以使用類型參數

}

泛型的使用:

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

MyArray  list=new MyArray<>();

【注】

  • 類型后的<>代表占位符,表示當前類是一個泛型類

  • 在實例化泛型時,<>中不能是簡單的類型,需要是包裝類

  • <>不參與泛型的類型組成

  • 不能new泛型類型的數組

  • 使用泛型不需要進行強制類型轉換

一個簡單的泛型:

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

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

為什么不能實例化泛型類型的數組?

數組和泛型之間的一個重要區別是它們如何強制執行類型檢查。數組在運行時存儲和檢查類型信息,而泛型是在編譯時檢查類型錯誤。

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

3、泛型的上界

語法:

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

}

例:

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

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

//E一定實現了Comparable接口的類

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

4、通配符

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

如下兩段代碼:

代碼一:
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的具體是什么數據類型,我們是不清楚的。

(1)通配符的上界

語法:

<? extends 上界>

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

例:對于以下關系,我們需要寫一個方法來打印存儲了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);//調用了T的toString
    }
}

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

代碼二:通過通配符實現

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

兩種代碼的區別:

  • 對于泛型實現的方法來說,<T extends Animal>對T進行了限制,只能是Animal的子類。傳入Cat,就是Cat。

  • 對于通配符實現的方法來說,相當于對Animal進行了規定,允許傳入Animal的子類。具體哪個子類,此時并不清楚。如:傳入Cat,實際上聲明的類型是Animal,使用多態才能調用Cat的toString方法

通配符上界&rarr;父子類關系:

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

MyArrayList<? extends Number>是MyArrayList<Integer>或者MyArrayList<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不讓這樣進行添加操作。
 Number a = list.get(0);//可以通過
 Integer i = list.get(0);//編譯錯誤,只能確定是Number子類

【注】

  • 不能對其進行添加,list中存儲的可能是Number也可能是Number的子類,無法確定類型。

  • 通配符上界適合讀取,不適合寫入。

(2)通配符的下界

語法:

<? super 下界>

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

通配符下界的父子類關系:

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

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

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

5、包裝類

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

拆箱和裝箱:

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

以上就是“Java泛型與包裝類實例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三河市| 石河子市| 宁津县| 理塘县| 北川| 张家界市| 青田县| 布尔津县| 册亨县| 土默特右旗| 策勒县| 金乡县| 公主岭市| 镇安县| 车致| 汨罗市| 盐源县| 历史| 涞水县| 汝州市| 全州县| 九寨沟县| 台南县| 久治县| 柞水县| 冷水江市| 聊城市| 忻州市| 鸡东县| 宁夏| 崇仁县| 岑溪市| 巴彦淖尔市| 京山县| 华容县| 桂林市| 东乌珠穆沁旗| 常山县| 本溪市| 灌阳县| 沽源县|