泛型深入
泛型定義:
? ? ? ? JDK5引入的特性,可以在編譯階段約束操作的數據類型,并進行檢查
泛型格式:
? ? ? ? <數據類型>
? ? ? ? 注意:泛型只能支持引用數據類型
優勢:
? ? ? ? 統一數據類型;
? ? ? ? 把運行時期的問題提前到了編譯期間,避免了強制類型轉換可能出現的異常,因為在編譯階段類型就能確定下來。
Java中的泛型是偽泛型:在編譯階段會檢查是否符合要求的數據類型,但是在運行期間又是Object類型(泛型的擦除)
細節:
? ? ? ? 泛型中不能寫基本數據類型;
? ? ? ? 指定泛型的具體類型之后,傳遞數據時,可以傳入該類類型或者子類類型;
? ? ? ? 如果不寫泛型,類型默認是Object;
泛型類:
? ? ? ? 使用場景:
? ? ? ? ? ? ? ? 當一個類中,某個變量的數據類型不確定時,就可以定義帶有泛型的類
????????????????
public class ArrayList<E>{}
? ? ? ? ????????此處的E可以理解為變量,但是不是用來記錄數據的,而是記錄數據的類型 。
? ? ? ? 定義泛型類:
????????
package com.lazyGirl.nenericsdemo;import java.util.Arrays;public class MyArrayList <E>{Object[] objs = new Object[10];int size = 0;public boolean add(E e){objs[size] = e;size += 1;return true;}public E get(int index){return (E )objs[index];}@Overridepublic String toString(){return Arrays.toString(objs);}
}
????????測試:?
????????
public class GenericTest {public static void main(String[] args) {MyArrayList<String> mal = new MyArrayList<>();mal.add("A");mal.add("B");System.out.println(mal.get(0));System.out.println(mal.toString());MyArrayList<Integer> mal1 = new MyArrayList<>();mal1.add(1);mal1.add(2);mal1.add(3);System.out.println(mal1.get(0));System.out.println(mal1.toString());}
}
? ? ? ? 輸出:
????????
?泛型方法:
? ? ? ? ?方法中形參類型不確定時,可以使用類名后面定義的泛型<E>(所有方法都能使用);也可以在方法聲明上定義自己的泛型(只有本方法能用)
? ? ? ? 格式:
public <T> void show(T t){}
? ? ? ? 此處T可以理解為變量,用來記錄類型
????????
package com.lazyGirl.nenericsdemo;import java.util.ArrayList;public class ListUtils {private ListUtils() {}public static<E> void addAll(ArrayList<E> list,E...e){for (E e1 : e) {list.add(e1);}}
}
????????測試:
import java.util.ArrayList;public class ListUtilsTest {public static void main(String[] args) {ArrayList<String> list = new ArrayList<String>();ListUtils.addAll(list,"A","B","C","D");System.out.println(list);}
}
? ? ? ? 輸出:
?????????
泛型接口:?
?格式:
public interface List<E>{}
如何使用:
? ? ? ? ?方式1:實現類給出具體類型
? ? ? ? 方式2:實現類延續泛型,創建對象時再確定
????????
package com.lazyGirl.nenericsdemo;import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class MyArrayList2 implements List<String> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}//.....
}
泛型 不具備繼承性,但是數據具備繼承性
import java.util.ArrayList;public class GenericDemo2 {public static void main(String[] args) {ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();method(list1);list1.add(new Ye());list1.add(new Fu());list1.add(new Zi());}public static void method(ArrayList<Ye> list){}
}class Ye{}class Fu extends Ye{}class Zi extends Fu{}
? ? ? ? 或者:
import java.util.ArrayList;public class GenericDemo3 {public static void main(String[] args) {ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();method(list1);method(list2);method(list3);}public static<E> void method(ArrayList<E> list){}
}
泛型的通配符:??
??extends E:表示可以傳遞E或者E的所有子類類型
? super E: 可以傳遞E或者E所有的父類類型
? ? ? ? 應用場景:
?????????1. 定義類,方法,接口的時候,類型不確定,就可以定義泛型類,泛型方法,泛型接口
? ? ? ? ?2。 如果類型不確定,但是能知道以后只能傳遞某個繼承體系中的,就可以使用泛型的通配符
? ? ? ? 關鍵點:可以限定類型的范圍
?
?