Java基础—泛型
目錄
一、泛型方法
二、泛型類
三、類型通配符?
四、類型擦除
泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。泛型本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。比如我們要寫一個排序方法,能夠?qū)φ蛿?shù)組、字符串數(shù)組甚至其他任何類型的數(shù)組進行排序,我們就可以使用?Java?泛型。
一、泛型方法<E>
你可以寫一個泛型方法,該方法在調(diào)用時可以接收不同類型的參數(shù)。根據(jù)傳遞給泛型方法的參數(shù)類型,編譯器適當?shù)靥幚砻恳粋€方法調(diào)用。
//?泛型方法 printArray public static?<E>?void printArray(?E[] inputArray?)?{for ( E element : inputArray ){ System.out.printf( "%s ", element );} }泛型的限定:
二、泛型類<T>
泛型類的聲明和非泛型類的聲明類似,除了在類名后面添加了類型參數(shù)聲明部分。和泛型方法一樣,泛型類的類型參數(shù)聲明部分也包含一個或多個類型參數(shù),參數(shù)間用逗號隔開。一個泛型參數(shù),也被稱為一個類型變量,是用于指定一個泛型類型名稱的標識符。因為他們接受一個或多個參數(shù),這些類被稱為參數(shù)化的類或參數(shù)化的類型。
適用于當一個類型變量用來表達兩個參數(shù)之間或者參數(shù)與返回值之間的關(guān)系時,即統(tǒng)一各類型變量在方法簽名的兩處(參數(shù)或返回值)被使用,或者類型變量在方法體代碼中也被使用而不僅僅在簽名的時候使用,這是應(yīng)該用自定義泛型<T>。泛型方可以調(diào)用一些有關(guān)類型的方法。比如集合的add方法。
public class?Box<T>?{private T t;public void add(T t) {this.t = t;}public T get() {return t;} }三、類型通配符?
類型通配符一般是使用?代替具體的類型參數(shù)。例如?List<?>?在邏輯上是List<String>,List<Integer>?等所有?List<具體類型實參>的父類。適合用于在整個類中只有一處使用了泛型。使用時注意加了泛型的參數(shù)不能調(diào)用與參數(shù)類型有關(guān)的方法。比如打印出任意參數(shù)化類型集合中的所有內(nèi)容,就適合用通配符泛型<?>
public static void printCollecton(Collection <?> collection){for(Object obj: collection){System.out.println(obj);} }泛型三種:
- ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T類型
 - ArrayList<?> al=new ArrayList<?>();集合元素可以是任意類型,這種沒有意義,一般是方法中,只是為了說明用法
 - ArrayList<? extends E> al=new ArrayList<? extends E>();
 
四、類型擦除
Java?中的泛型基本上都是在編譯器這個層次來實現(xiàn)的。在生成的?Java?字節(jié)代碼中是不包含泛型中的類型信息的。使用泛型的時候加上的類型參數(shù),會被編譯器在編譯的時候去掉,這個過程就稱為類型擦除。如在代碼中定義的?List<Object>和?List<String>等類型,在編譯之后都會變成?List。JVM?看到的只是?List,而由泛型附加的類型信息對?JVM?來說是不可見的。類型擦除的基本過程也比較簡單,首先是找到用來替換類型參數(shù)的具體類。這個具體類一般是?Object。如果指定了類型參數(shù)的上界的話,則使用這個上界。把代碼中的類型參數(shù)都替換成具體的類。
總結(jié)
                            
                        - 上一篇: Java基础—反射—简单介绍
 - 下一篇: Java基础—注解