1. 程式人生 > >Java泛型理解

Java泛型理解

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泛型理解