- ??專欄內容:Java
- ?個人主頁:子夜的星的主頁
- ??座右銘:前路未遠,步履不停
一、泛型
1、什么是泛型
在傳統(tǒng)的編程方法中,類和方法通常被限定為使用特定的類型。這些類型可能是基礎的數(shù)據(jù)類型(如整數(shù)、字符等),或者是由程序員自己定義的復雜類型。這種方式在處理單一類型數(shù)據(jù)時很有效,但當我們需要編寫更加靈活、能夠適用于多種數(shù)據(jù)類型的代碼時,這種嚴格的類型限制就變成了一個約束。
泛型,就是為了解決這種限制而生的。簡單來說,泛型可以理解為一種“類型模板”,它允許程序員編寫的代碼能夠適應不同的數(shù)據(jù)類型,而不必為每種可能的數(shù)據(jù)類型都編寫一個新版本。
泛型的厲害之處,就在于它的靈活性和重用性。你可以寫一個泛型方法或類,然后在需要的時候用具體的類型去實例化它,比如整數(shù)、字符串或者是你自定義的任何類型。這樣,你就可以用同一套代碼處理不同類型的數(shù)據(jù),極大地提高了代碼的通用性和可維護性。
2、泛型的語法
泛型的基本語法主要包括以下幾個方面:
-
泛型類和接口:
- 在類或接口后面加上
<T>
來聲明一個泛型類或接口。 -
T
是類型參數(shù),代表一種未指定的類型。在實例化類或接口時,你可以用具體的類型替換它。 - 示例:
public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
這個例子中,
Box
類可以用任何類型的對象來實例化,例如Box<Integer>
或Box<String>
。 - 在類或接口后面加上
-
泛型方法:
- 泛型方法可以定義在普通類中,也可以定義在泛型類中。
- 在方法返回類型之前使用
<T>
來聲明一個泛型方法。 - 示例:
public <T> T genericMethod(T t) { return t; }
這個方法可以接受任何類型的參數(shù),并返回相同類型的對象。
-
類型通配符:
- 使用
?
表示未知類型,通常用在參數(shù)、字段、局部變量上,以及泛型方法的返回類型上。 - 示例:
public void processElements(List<?> elements) { for (Object e : elements) { // 處理e } }
List<?>
可以接受任何類型的List
。 - 使用
-
限定的類型參數(shù):
- 你可以限制類型參數(shù)可以接受的類型范圍。
- 使用
extends
關鍵字來限定類型參數(shù)的上界(即它必須是特定類或接口的子類型)。 - 示例:
public <T extends Number> double sum(List<T> numbers) { double sum = 0.0; for (Number n : numbers) { sum += n.doubleValue(); } return sum; }
這個方法只接受Number
類型或其子類的List
。
泛型存在的意義:
- 在編譯的時候,幫我們進行類型的檢查。
- 在編譯的時候,幫我們進行類型的轉換。
二、泛型類的使用
1、泛型類的語法
泛型類<類型實參> 變量名; // 定義一個泛型類引用
new 泛型類<類型實參>(構造方法實參); // 實例化一個泛型類對象
MyArray<Integer> list = new MyArray<Integer>();
注意:泛型只能接受類,所有的基本數(shù)據(jù)類型必須使用包裝類!
2、泛型如何編譯的
2.1、擦除機制
在編譯時,Java編譯器將所有的泛型類型參數(shù)替換掉,這個過程就是類型擦除。
- 泛型類型參數(shù)被替換為它們的邊界或者
Object
。 - 如果類型參數(shù)是有界的(
<T extends Number>
),編譯器將類型參數(shù)替換為它的第一個邊界。 - 如果類型參數(shù)是無界的(
<T>
),編譯器將類型參數(shù)替換為Object
。
Java的泛型機制是在編譯級別實現(xiàn)的,編譯器生成的字節(jié)碼在運行期間并不包含泛型的類型信息。
2.2、為什么不能實例化泛型類型數(shù)組
class MyArray<T> {
public T[] array = (T[])new Object[10];
public T getPos(int pos) {
return this.array[pos];
}
public void setVal(int pos,T val) {
this.array[pos] = val;
}
public T[] getArray() {
return array;
}
}
public class demo1 {
public static void main(String[] args) {
MyArray<Integer> myArray1 = new MyArray<>();
Integer[] strings = myArray1.getArray();
}
}
由于類型擦除的原因,不能直接創(chuàng)建一個泛型數(shù)組。類型擦除會將泛型類型參數(shù)T
替換為Object
,這導致了類型不匹配,從而在運行時拋出ClassCastException
。
3、泛型方法
語法:方法限定符 <類型形參列表> 返回值類型 方法名稱(形參列表) { ... }
文章來源:http://www.zghlxwxcb.cn/news/detail-788738.html
例子:寫一個泛型方法,用于交換數(shù)組中兩個元素的位置:文章來源地址http://www.zghlxwxcb.cn/news/detail-788738.html
public class GenericMethodTest {
// 泛型方法 printArray
public static < E > void printArray( E[] inputArray ) {
for(E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String args[]) {
// 創(chuàng)建不同類型數(shù)組: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println("整型數(shù)組元素為:");
printArray(intArray); // 傳遞一個整型數(shù)組
System.out.println("\n雙精度型數(shù)組元素為:");
printArray(doubleArray); // 傳遞一個雙精度型數(shù)組
System.out.println("\n字符型數(shù)組元素為:");
printArray(charArray); // 傳遞一個字符型數(shù)組
}
}
- 泛型方法可以聲明在普通類或泛型類中。
- 泛型方法的聲明包括一個類型參數(shù)部分,跟在方法的修飾符和返回類型之前。
- 類型參數(shù)部分是一個尖括號括起來的類型參數(shù)列表,如
<T>
。
到了這里,關于Java泛型:靈活多變的類型參數(shù)化工具的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!