泛型
泛型,JDK1.5新加入的,解決數據類型的安全性問題,其主要原理是在類聲明時通過一個標識表示類中某個屬性的類型或者是某個方法的返回值及參數類型。這樣在類聲明或實例化時只要指定好需要的具體的類型即可。
Java泛型可以保證如果程序在編譯時沒有發出警告,運行時就不會產生ClassCastException異常。同時,代碼更加簡潔、健壯。
? Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結果后,會將泛型的相關信息擦出,并且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法。也就是說,泛型信息不會進入到運行時階段。
1.對象實例化時不指定泛型,默認為:Object。
2.泛型不同的引用不能相互賦值。
//定義一個泛型接口
interface Generator<T> {
T next();
}
1
2
3
4
未傳入泛型實參時,與泛型類的定義相同,在聲明類的時候,需將泛型的聲明也一起加到類中
即:class FruitGenerator implements Generator{
如果不聲明泛型,如:class FruitGenerator implements Generator,編譯器會報錯:“Unknown class”
*/
class FruitGenerator<T> implements Generator<T>{
@Override
public T next() {
return null;
}
}
/**
傳入泛型實參時:
定義一個生產器實現這個接口,雖然我們只創建了一個泛型接口Generator
但是我們可以為T傳入無數個實參,形成無數種類型的Generator接口。
在實現類實現泛型接口時,如已將泛型類型傳入實參類型,則所有使用泛型的地方都要替換成傳入的實參類型
即:Generator,public T next();中的的T都要替換成傳入的String類型。
*/
class FruitGenerator implements Generator<String> {
@Override
public String next() {
// TODO Auto-generated method stub
return null;
}
}
泛型方法 方法,也可以被泛型化,不管此時定義在其中的類是不是泛型化的。在泛型方法中可以定義泛型參數,此時,參數的類型就是傳入數據的類型。
泛型方法的格式:
public class DAO {
public <E> void show(E e){
System.out.println(e.toString());
}
public <T> T show1(T t){
return t;
}
}
/**
* 泛型方法與可變參數
* @param args
*/
public <T> void printMsg( T... args){
for(T t : args){
System.out.println("泛型測試 ,t is " + t);
}
}
/**
* 靜態方法無法訪問類上定義的泛型;
* 如果靜態方法操作的引用數據類型不確定的時候,必須要將泛型定義在方法上
* @author lby
* @param <T>
*/
class StaticGenerator<T> {
/**
* 如果在類中定義使用泛型的靜態方法,需要添加額外的泛型聲明(將這個方法定義成泛型方法)
* 即使靜態方法要使用泛型類中已經聲明過的泛型也不可以。
* 如:public static void show(T t){..},此時編譯器會提示錯誤信息:
"StaticGenerator cannot be refrenced from static context"
*/
public static <T> void show(T t){
}
}
通配符
/**
* 不確定集合中的元素具體的數據類型
* 使用?表示所有類型
* @param list
*/
public void test(List<?> list){
System.out.println(list);
}
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。