1.泛型定義?
1.參化類型,數是JDK1.5的新特性。(定義泛型時使用參數可以簡單了解為形參),例如List,Map<K,V>
2.編譯時的一種類型,此類型僅僅在編譯階段有效,運作時無效.例如List在運作時String會被擦除,最終系統會認為都是Object.
2.泛型的應用類型
泛型定義時常用方式有三種:
1.泛型類: class 類名<泛型,…>{}
2.泛型接口: interface 接口名<泛型,…>{}
3.泛型方法: 通路修飾符 <泛型> 方法傳回值類型 方法名(形參){}
代碼實作:
類泛型定義:(用于限制類中方法參數和方法傳回值類型)
class Container<T>{//類泛型:類名<泛型>
public void add(T t){}//通過類泛型限制方法參數類型
public T get(){//通過類泛型限制方法傳回值類型
return null;
}
}
類泛型應用:關鍵代碼分析
Container<Integer> c1=new Container<>();
c1.add(100);//自定封箱 Integer.valueOf(100)
//c1.add("ABC");
Integer t1=c1.get();
…
說明:自定封箱 Integer.valueOf(100)
泛型應用時相當于實參傳給形參,但是實參必須為對象類型。
接口泛型定義:
定義接口時指定泛型,用于限制接口方法參數類型以及方法傳回值類型,
interface Task<Param,Result>{//思考map中的泛型Map<K,V>
/**
* 此方法用于執行任務
* @param arg 其類型由泛型參數Param決定
* @return 其類型由泛型參數result決定
*/
Result execute(Param arg1);
}
方法泛型應用:
class ClassPathXmlApplicationContext{
//泛型方法:寫一個getBean方法(仿照spring官方)
public <T>T getBean(Class<T> cls){
return null;
}
public <T>T getBean(String id,Class<T> cls){
return null;
}
}
總結:
1)泛型類和泛型接口用于限制類或接口中執行個體方法參數類型,傳回值類型.
2)泛型類或泛型接口中實際泛型類型可以在定義子類或建構其對象時傳入.
3)泛型方法用于限制本方法(執行個體方法或靜态方法)的參數類型或傳回值類型.
4)泛型類上的泛型不能限制類中靜态方法的泛型類型.
3.泛型的通配符"?"
1.泛型應用時有一個特殊符号”?”,可以代表一種任意參數類型(實參類型)。
2.通配符泛型隻能應用于變量的定義。例如:Class<?> c1;
/**
* 泛型通配符"?"的應用
* 說明:"?"代表一種不确定的類型,
* 當使用一個泛型類時假如其類型不确定可以使用"?"替代
*/
public class TestGeneric05 {
public static void main(String[] args)throws Exception {
Class<Object> c1=Object.class; //類對象
//System.out.println(c1.toString());
//"?"為泛型應用的一個通配符
//當泛型應用時,無法判定具體類型時,使用"?"替代
//此案例在編譯階段根本無法确定字元串中代理的類型具體為何種類型.
Class<?> c2=Class.forName("java.lang.Object");
//Class<Log> c3=Class.forName("java.lang.Object"); 錯誤
System.out.println(c1==c2);
}
}
4.泛型的上下界問題
泛型在應用時通常要指定對象的上屆和下屆,其實作方式如下:
1.指定泛型下界:<? super 類型>
2.指定泛型上界:<? extends 類型>
例如:分析對錯
List list1=new ArrayList(); 錯誤
List list2=new ArrayList(); 錯誤
List<? extends CharSequence> list1=new ArrayList(); 正确
List<? super Integer> list2=new ArrayList();正确
說明:這種上下界一般會用于方法參數變量定義,方法傳回值類型定義。
總結:
泛型問題不再詳細贅述,想要了解更詳細的,可面向百度。本文部分内容摘自齊*的文檔,在此向老師表達敬意。看過的小夥伴可以評論和支援哦!