Java泛型理解
阿新 • • 發佈:2018-05-27
for pub 機制 xtend bject 進行 允許 數組元素 不能
Java泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。當需要使用某一種算法時,又無法具體算法的數據類型,或者想指定類型值的上限或下限,那麽這時就需要Java泛型來大顯身手了!
泛型方法的規則:
- 所有泛型方法聲明都有一個類型參數聲明部分(由尖括號分隔),該類型參數聲明部分在方法返回類型之前。
- 每一個類型參數聲明部分包含一個或多個類型參數,參數間用逗號隔開。一個泛型參數,也被稱為一個類型變量,是用於指定一個泛型類型名稱的標識符。
- 類型參數能被用來聲明返回值類型,並且能作為泛型方法得到的實際參數類型的占位符。
- 泛型方法體的聲明和其他方法一樣。註意類型參數只能代表引用型類型,不能是原始類型(像int,double,char的等)。
實例:
一、定義一個泛型方法來打印對象數組元素
1 public static <E> void printArray(E[] inputArray){ 2 for(E elements:inputArray){ 3 System.out.print(elements); 4 } 5 } 6 7 public static void main(String[] args){ 8 Integer[] intArray={4,5,6,5,8}; 9 Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };10 Character[] charArray = { ‘H‘, ‘E‘, ‘L‘, ‘L‘, ‘O‘ }; 11 12 System.out.println( "整型數組元素為:" ); 13 printArray( intArray ); 14 15 System.out.println( "\n雙精度型數組元素為:" ); 16 printArray( doubleArray ); 17 18 System.out.println( "\n字符型數組元素為:" ); 19 printArray( charArray );20 }
二、定義一個泛型方法來對數字進行排序(extends 使用)
1 public static <E extends Comparable> E searchMaxnumber(E x,E y,E z){ 2 E maxNumber=x; 3 if(y.compareTo(maxNumber) > 0){ 4 maxNumber=y; 5 } 6 if(z.compareTo(maxNumber)>0){ 7 maxNumber=z; 8 } 9 return maxNumber; 10 } 11 12 public static void main(String[] args){ 13 System.out.printf( "%d, %d 和 %d 中最大的數為 %d\n\n", 14 3, 4, 5, searchMaxnumber( 3, 4, 5 ) ); 15 System.out.printf( "%.1f, %.1f 和 %.1f 中最大的數為 %.1f\n\n", 16 6.6, 8.8, 7.7, searchMaxnumber( 6.6, 8.8, 7.7 ) ); 17 System.out.printf( "%s, %s 和 %s 中最大的數為 %s\n","pear", 18 "apple", "orange", searchMaxnumber( "pear", "apple", "orange" ) ); 19 }
三、泛型類的定義
1 public class GenericityExam<E> { 2 3 private E e; 4 5 public E get(){ 6 return e; 7 } 8 9 public void put(E e){ 10 this.e=e; 11 } 12 13 public static void main(String[] args) { 14 GenericityExam<Integer> integerVal = new GenericityExam<Integer>(); 15 GenericityExam<Character> charVal = new GenericityExam<Character>(); 16 17 integerVal.put(new Integer(10)); 18 charVal.put(new Character(‘s‘)); 19 20 System.out.printf("整型值為 :%d\n", integerVal.get()); 21 System.out.printf("字符為 :%c\n", charVal.get()); 22 } 23 24 }
四、類型通配符上限泛型
public static <E> void listGen(List<? extends E> data){
for(E listData:data){
System.out.println("data :" + listData);
}
}
public static void main(String[] args) {
List<Integer> listIn = new ArrayList<>();
List<Number> listNu = new ArrayList<>();
listIn.add(18);
listIn.add(45);
listNu.add(314);
listNu.add(789);
listGen(listIn);
listGen(listNu);
}
- <? extends E>表示該通配符所代表的類型是E類型的子類。
- <? super E>表示該通配符所代表的類型是E類型的父類。
泛型定義好後,在運行期間會變化為Object類型。
Java泛型理解