一:泛型 的好處:
1. 把運行時出現 的問題提前至了編譯時。
2. 避免了無謂的強制類型轉換。
什麼時候使用泛型:當類中操作的引用數據類型不確定的時候,就可以使用泛型類.
在泛型中沒有多態的概念,兩邊的數據必須要一致。 或者是隻寫一邊 的泛型類型。建議兩邊的數據類型都寫上一致的。
自定義泛型: 自定義泛型可以理解爲是一個數據類型的佔位符,或者是理解爲是一個數據類型的變量。
細節一: 聲明好泛型類型之後,集合中只能存放特定類型元素
public class Demo6 {
public static void main(String[] args) {
//創建一個存儲字符串的list
ArrayList<String> arr=new ArrayList<String>();
arr.add("as");
arr.add("sds");
//存儲非字符串編譯報錯.
arr.add(1);
}
}
細節二: 泛型類型必須是引用類型
public class Demo6 {
public static void main(String[] args) {
// 泛型類型必須是引用類型,也就是說集合不能存儲基本數據類型
// ArrayList<int> arr2=new ArrayList<int>();
// 使用基本數據類型的包裝類
ArrayList<Integer> arr2 = new ArrayList<Integer>();
}
}
細節三: 使用泛型後取出元素不需要類型轉換.
public class Demo6 {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
arr.add("dsd");
arr.add("fdf");
arr.add("dsds");
//使用泛型後取出元素不需要類型轉換.
String str=arr.get(0);
System.out.println();
}
}
二:泛型的分類
1. 泛型方法:
泛型方法的定義格式:
修飾符 <聲明自定義泛型>返回值類型 函數名(形參列表..){
}
注意:
1. 在方法上的自定義泛型的具體數據類型是調用該方法的時候傳入實參的時候確定的。
2. 自定義泛型使用的標識符只要符合標識符的命名規則即可。
demo需求: 定義一個函數可以接收任意類型的參數,要求函數的返回值類型與實參的數據類型要一致。
public class Demo2 {
public static void main(String[] args) {
Integer i= print(12); // Integer
String str = print("abc");
}
//<T> 把T字母聲明爲自定義 的泛型、
public static <T> T print(T o){
return o;
}
}
2 . 泛型類
泛型類的定義格式:
修飾符 class 類名<聲明自定義的泛型>{
}
注意的事項:
1. 在類上自定義的泛型的具體數據類型是在創建對象的時候指定的。
2. 在類上自定義了泛型,如果創建該類的對象時沒有指定泛型的具體類型,那麼默認是Object類型。
public class Demo6<T> {
public static void main(String[] args) {
// 使用泛型類,創建對象的時候需要指定具體的類型
new Demo6<Integer>().getData(5);
}
public T getData(T data) {
return data;
}
// 反序任意類型數組
public void reverse(T[] arr) {
int start = 0;
int end = arr.length - 1;
for (int i = 0; i < arr.length; i++) {
if (start < end) {
T temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
}
在泛型類中定義一個靜態方法
public class Demo6<T> {
public static void main(String[] args) {
System.out.println(getData2(100));
}
public T getData(T data) {
return data;
}
//靜態方法
public static T getData2(T data) {
return data;
}
}
注意:靜態方法不可以使用類中定義的泛型
因爲類中的泛型需要在對象初始化時指定具體的類型,而靜態優先於對象存在。那麼類中的靜態方法就需要單獨進行泛型聲明,聲明泛型一定要寫在static後,返回值類型之前
泛型類細節:
1、創建對象的時候要指定泛型的具體類型 2、創建對象時可以不指定泛型的具體類型(和創建集合對象一眼)。默認是Object,例如我們使用集合存儲元素的時候沒有使用泛型就是那麼參數的類型就是Object 3、類上面聲明的泛型只能應用於非靜態成員函數,如果靜態函數需要使用泛型,那麼 需要在函數上獨立聲明。 4、如果建立對象後指定了泛型的具體類型,那麼該對象操作方法時,這些方法只能操作一種數據類型。 5、所以既可以在類上的泛型聲明,也可以在同時在該類的方法中聲明泛型。 |
3 . 泛型接口:
泛型接口的定義格式:
interface 接口名<聲明自定義的泛型>{
}
在接口上自定義泛型要注意的事項:
1. 在接口上自定義泛型的具體數據類型是在實現該接口的時候指定的。
2. 如果一個接口自定義了泛型,在實現該接口的時候沒有指定具體的數據類型,那麼默認是Object數據類型。
interface Inter<T> {
void print(T t);
}
// 實現不知爲何類型時可以這樣定義
class MyInter<T> implements Inter<T> {
public void print(T t) {
System.out.println("myprint:" + t);
}
}
//使用接口時明確具體類型。
class MyInter2 implements Inter<String> {
@Override
public void print(String t) {
System.out.println("myprint:" + t);
}
}