Java(九) 泛型必備知識
一 泛型
泛型是jdk1.5使用的新特性。
泛型的設計初衷為了引數化型別
泛型的好處:
1. 將執行時的異常提前至了編譯時。
2. 避免了無謂的強制型別轉換 。
常見應用還是幾種自定義泛型。
泛型的幾種用法
1 方法泛型
2 類泛型
3 介面泛型
二 方法泛型
修飾符 <宣告自定義的泛型>返回值型別 函式名(使用自定義泛型 …){
}
public static <abc>abc getData(abc o){
return o;
}
需求: 定義一個方法可以接收任意型別的引數,而且返回值型別必須 要與實參的型別一致。
public class Demo2 {
public static void main(String[] args) {
String str = getData("abc");
Integer i = getData(123);
}
public static <abc>abc getData(abc o){
return o;
}
}
三 自定義類泛型
class 類名<宣告自定義泛型>{
}
泛型類要注意的事項:
1. 在類上自定義泛型的具體資料型別是在使用該類的時候建立物件時候確定的。
2. 如果一個類在類上已經聲明瞭自定義泛型,如果使用該類建立物件 的時候沒有指定 泛型的具體資料型別,那麼預設為Object型別
3.在類上自定義泛型不能作用於靜態的方法,如果靜態的方法需要使用自定義泛型,那麼需要在方法上自己宣告使用。
class MyArrays<T>{
//元素翻轉
public void reverse(T[] arr){
for(int startIndex = 0, endIndex = arr.length-1 ; startIndex<endIndex ; startIndex++,endIndex--){
T temp = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = temp;
}
}
//
public String toString(T[] arr){
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < arr.length ; i++){
if(i==0){
sb.append("["+arr[i]+",");
}else if(i==arr.length-1){
sb.append(arr[i]+"]");
}else{
sb.append(arr[i]+",");
}
}
return sb.toString();
}
public static <T>void print(T[] t){
}
}
四 泛型介面
泛型介面的定義格式:
interface 介面名<宣告自定義泛型>{
}
泛型介面要注意的事項:
1. 介面上自定義的泛型的具體資料型別是在實現一個介面的時候指定 的。
2. 在介面上自定義的泛型如果在實現介面的時候沒有指定具體的資料型別,那麼預設為Object型別。
需求: 目前我實現一個介面的時候,我還不明確我目前要操作的資料型別,我要等待建立介面實現類 物件的時候我才能指定泛型的具體資料型別。
如果要延長介面自定義泛型 的具體資料型別,那麼格式如下:
格式:
public class Demo4<T> implements Dao<T>{
}
*/
interface Dao<T>{
public void add(T t);
}
public class Demo4<T> implements Dao<T> {
public static void main(String[] args) {
Demo4<String> d = new Demo4<String>();
}
public void add(T t){
}
}
五 泛型的上下限
/*
泛型的上下限:
需求1: 定義一個函式可以接收接收任意型別的集合物件, 要求接收的集合物件只能儲存Integer或者是Integer的父類型別資料。
需求2: 定義一個函式可以接收接收任意型別的集合物件, 要求接收的集合物件只能儲存Number或者是Number的子類型別資料。
泛型中萬用字元: ?
? super Integer : 只能儲存Integer或者是Integer父類元素。 泛型 的下限
? extends Number : 只能儲存Number或者是Number型別的子類資料。 泛型上限
*/
public class Demo5 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Number> list2 = new ArrayList<Number>();
HashSet<String> set = new HashSet<String>();
//getData(set);
}
//泛型的上限
public static void getData(Collection<? extends Number> c){
}
//泛型的下限
public static void print(Collection<? super Integer> c){
}
}