目錄
包裝類
基本數據類型與對應的包裝類
裝箱和拆箱
裝箱
拆箱
泛型
什么是泛型
泛型的語法與使用
泛型的編譯
擦除機制
泛型的上界
泛型方法
提到泛型的話,我們就先提一下包裝類吧!
包裝類
在Java中,由于基本類型不是繼承自Object,為了在泛型代碼中可以支持基本類型,Java給每個基本類型都對應了一個包裝類型。(注意int和char的包裝類不是只大寫第一個字母)
基本數據類型與對應的包裝類
基本數據類型 | 包裝類 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
裝箱和拆箱
裝箱
裝箱:把一個基本數據類型 轉化為 包裝類型的過程
裝箱又分為自動裝箱和顯示裝箱,但是都調用了valueof()方法。下面代碼可以體現
eg:
public static void main(String[] args) {
int a = 10;
Integer b = a; //自動裝箱
Integer c = Integer.valueOf(a); //顯示裝箱
}
拆箱
拆箱:把一個包裝類型 轉化為 基本數據類型的過程
拆箱也分為自動裝箱和顯示裝箱。下面代碼可以體現
eg:
public static void main(String[] args) {
Integer a = new Integer(10);
int b = a; //自動拆箱
int c = a.intValue(); //顯示拆箱
double d = a.doubleValue();
}
泛型
什么是泛型
就是適用于許多許多類型。從代碼上講,就是對類型實現了參數化。
下面咱看一個問題:
實現一個類,類中包含一個數組成員,使得數組中可以存放任何類型的數據,也可以根據成員方法返回數組中某個下標的值?
class MyArray {
//可以存放任何類型的話 定義一個Object數組
public Object[] array = new Object[10];
//pos放入的位置 val存放的數據
public void set(int pos, Object val) {
array[pos] = val;
}
//獲取數據
public Object get(int pos) {
return array[pos];
}
}
但是這樣寫的話需要強轉類型
?那么怎么解決呢?
這就不得不提出泛型了
泛型的語法與使用
class 泛型類名稱<類型形參列表> {
// 這里可以使用類型參數
}
?作用:
1. 泛型是將數據類型參數化,進行傳遞
2. 使用 <T> 表示當前類是一個泛型類。
3. 泛型目前為止的優(yōu)點:數據類型參數化,編譯時自動進行類型檢查和轉換
這樣(代碼體現)就能解決上面的問題了(可以不用強制類型轉換)
class MyArray<T> {
//可以存放任何類型的話 定義一個Object數組
public Object[] array = new Object[10];
//pos放入的位置 val存放的數據
public void set(int pos, T val) {
array[pos] = val;
}
//獲取數據
public T get(int pos) {
return (T)array[pos];
}
}
//測試類中的main方法
public static void main(String[] args) {
//<>里面只能放包裝類型
MyArray<String> myArray1 = new MyArray<>();
MyArray<Integer> myArray2 = new MyArray<>();
}
注意:不能new一個泛型類的數組 但是可以下面這樣寫(不推薦)
class MyArray<T> {
public T[] array2 = new T[10]; //不能直接new(下面會解釋)
public T[] array3 = (T[]) new Object[10];//不建議
}
泛型的編譯
擦除機制
通過命令:javap -c 查看字節(jié)碼文件,所有的T都是Object。在編譯的過程當中,將所有的T替換為Object這種機制,我們稱為:擦除機制。Java的泛型機制是在編譯級別實現的。編譯器生成的字節(jié)碼在運行期間并不包含泛型的類型信息。
提出問題:
1.那為什么,T[] ts = new T[5]; 是不對的,編譯的時候,替換為Object,不是相當于:Object[] ts = new Object[5]嗎?
這是因為在Java中,泛型類型擦除機制會將T轉換為Object,并且不支持創(chuàng)建泛型數組。
public class GenericArray<T> {
private T[] array;
public GenericArray(int size) {
this.array = new T[size]; // 編譯錯誤
}
}
上述代碼中,在使用new關鍵字創(chuàng)建GenericArray實例時,我們嘗試創(chuàng)建一個大小為size的泛型數組。但是,由于類型擦除機制,編譯器無法了解T的確切類型,因此無法創(chuàng)建泛型數組。
泛型的上界
語法:
?實例:
?這里的傳入的類型形參(E)必須是邊界(Number)的子類
求一個數組中的最大值想必大家都不陌生吧,那么大家看看下面的代碼,為什么報錯呢?
?這里是因為呢,在編譯的時候T會被替換成Object,但是在Object類中沒有沒有實現比較的接口,因為它是引用類型,必須 . 一個比較的方法,也得讓T實現比較的接口。代碼如下:
//這里extends是擴展的意思 不是繼承的意思
class Alg<T extends Comparable<T>> {
public T findMax(T[] array) {
T max = array[0];
for (int i = 1; i < array.length; i++) {
if(array[i].compareTo(max) > 0) {
max = array[i];
}
}
return max;
}
}
泛型方法
語法:
文章來源:http://www.zghlxwxcb.cn/news/detail-458350.html
示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-458350.html
//泛型方法 返回值為T類型
public static <T> T swap() {
}
到了這里,關于談談包裝類與泛型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!