Java?泛型超詳細入門講解
1、什么是泛型?
泛型其實就是將類型作為參數傳遞,泛型允許程序員在編寫代碼時使用一些以后才指定的類型 ,在實例化該類時將想要的類型作為參數傳遞,來指明這些類型。
為什么要引入泛型?
例如:自己實現一個順序表
public class MyArrayList {
public int[] elem;
public int usedSize;
public MyArrayList() {
this.elem = new int[10];
}
// add方法
public void add(int val) {
// 暫時不考慮擴容問題,這里只是為了講泛型
elem[usedSize++] = val;
}
// get方法
public int get(int pos) {
return elem[pos];
}
}
這里可以看出,在使用上面這個自定義的順序表時,我們只能添加 int 類型的元素,我們知道java集合中的順序表,可以添加任何類型的數據,怎么實現的呢?這里我們先嘗試將 int 類型變?yōu)镺bject類型,這樣就可以保證能傳入任何類型。
public class MyArrayList {
public Object[] elem;
public int usedSize;
public MyArrayList() {
this.elem = new Object[10];
}
// add方法
public void add(Object val) {
// 暫時不考慮擴容問題,這里只是為了講泛型
elem[usedSize++] = val;
}
// get方法
public Object get(int pos) {
return elem[pos];
}
}
main方法中往對象中添加數據時,可以添加任意類型的數據。但是,當需要取出數據時,因為返回的是Object類型,需要進行強轉才能用相對應的類型來接收,非常麻煩。
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
myArrayList.add(1);
myArrayList.add("hello");
int array1 = (int)myArrayList.get(0);
String array2 = (String)myArrayList.get(1);
}
所以問題來了,難道每次都要強轉一下才能接收嗎,能否不強轉呢?這時候我們就想到在創(chuàng)建一個實例對象時,可以將想要的類型作為參數傳遞,讓這個對象中全部存?zhèn)魅氲念愋偷臄祿?,那么拿出來的時候,就可以明確該對象中所有的數據都是該類型,不需要強轉了。這就引入了泛型。
public class MyArrayList<E> {
// 在編寫程序時,不指定具體的類型,而用<E>這里的E來暫時代替
// 具體的類型在實例化對象時傳入
public E[] elem;
public int usedSize;
public MyArrayList() {
// 這里的寫法不是特別準確,應該用反射機制,這里先這樣寫
this.elem = (E[])new Object[10];
}
// add方法
public void add(E val) {
// 暫時不考慮擴容問題,這里只是為了講泛型
elem[usedSize++] = val;
}
// get方法
public E get(int pos) {
return elem[pos];
}
}
public static void main(String[] args) {
MyArrayList<Integer> myArrayList1 = new MyArrayList<>();
myArrayList1.add(1);
myArrayList1.add(3);
// myArrayList1.add("world");// 這里會報錯,因為傳入的數據不是指定的類型,所以泛型還有自動對類型進行檢查的作用
int I1 = myArrayList1.get(0);
MyArrayList<String> myArrayList2 = new MyArrayList<>();
myArrayList2.add("hello");
myArrayList2.add("world");
String s1 = myArrayList2.get(0);
}
這樣就保證了能傳入任何類型的數據,同時在拿出時也不需要強轉!
泛型的意義:
1、自動對類型進行檢查
2、自動對類型進行強制類型轉換
那么這里MyArrayList對應對象的類型是什么呢?是MyArrayList< Integer > 之類的嗎?

這里可以看出,實例創(chuàng)建的對象他的類型都是MyArrayList,而<>中的內容不參與泛型類型的組成,那么<>里面的類型哪里去了呢?這就要了解泛型的工作機制了。
2、泛型是怎么編譯的
數組和泛型之間的一個重要區(qū)別是它們如何強制類型檢查。具體來說,數組在運行時存儲和檢查類型信息。但是,泛型在編譯時檢查類型錯誤,并且在運行時沒有類型信息。
泛型的編譯機制:擦除機制
在編譯時,將 MyArrayList 中的 E 擦成了 Object 類型。

在main方法中都擦成了 MyArrayList 類型。

到此這篇關于Java 泛型超詳細入門講解的文章就介紹到這了,更多相關Java 泛型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?boot事務無效報錯:Transaction?not?enabled問題排查解決
在業(yè)務代碼中經常需要保證事務的原子性,但是有的時候確實是出現事務沒有生效,這篇文章主要給大家介紹了關于Spring?boot事務無效報錯:Transaction?not?enabled問題排查的相關資料,需要的朋友可以參考下2023-11-11
解決SpringMvc后臺接收json數據中文亂碼問題的幾種方法
本篇文章主要介紹了解決SpringMvc后臺接收json數據中文亂碼問題的幾種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01

