Java—泛型

泛型是JDK 5 中引入的一個新特性,泛型提供了編譯時類型安全檢測機制,該機制容許程序員在編譯時檢測到非法的類型。泛型本質是參數化類型,也就是所操做的數據類型指定爲一個參數。程序員

假定咱們有這樣一個需求:寫一個排序方法,可以對整形數組、字符串數組甚至其餘任何類型的數組進行排序,該如何實現?數組

答案是可使用 Java 泛型安全

使用 Java 泛型的概念,咱們能夠寫一個泛型方法來對一個對象數組排序。而後,調用該泛型方法來對整型數組、浮點數數組、字符串數組等進行排序。app

1 泛型方法ide

規則:this

  • 全部泛型方法聲明都有一個類型參數聲明部分(由尖括號分隔),該類型參數聲明部分在方法返回類型以前(在下面例子中的<E>)。
  • 每個類型參數聲明部分包含一個或多個類型參數,參數間用逗號隔開。一個泛型參數,也被稱爲一個類型變量,是用於指定一個泛型類型名稱的標識符。
  • 類型參數能被用來聲明返回值類型,而且能做爲泛型方法獲得的實際參數類型的佔位符。
  • 泛型方法體的聲明和其餘方法同樣。注意類型參數只能表明引用型類型,不能是原始類型(像int,double,char的等)。

例:泛型比較大小spa

 1 package test;
 2 
 3 public class MaximumTest {
 4 
 5      // 比較三個值並返回最大值
 6        public static <T extends Comparable<T>> void maximum(T[] inputArray)
 7        {                     
 8            T max=inputArray[0];
 9            for(int i=1;i<inputArray.length;i++) {
10                if(inputArray[i].compareTo(max)>0) {
11                    
12                    max=inputArray[i];
13                }
14            }
15            System.out.println(max);
16        }
17        public static void main( String args[] )
18        {
19            Integer[] intArray = { 1, 2, 3, 4, 5 };
20            Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
21            String[] stringArray = { "pear", "apple","orange" };
22            
23            maximum( intArray );
24            maximum( doubleArray );
25            maximum(stringArray );
26        }
27 }
View Code

輸出結果:code

5
4.4
pear對象

2 泛型類blog

泛型類的聲明和非泛型類的聲明相似,除了在類名後面添加了類型參數聲明部分。

和泛型方法同樣,泛型類的類型參數聲明部分也包含一個或多個類型參數,參數間用逗號隔開。一個泛型參數,也被稱爲一個類型變量,是用於指定一個泛型類型名稱的標識符。由於他們接受一個或多個參數,這些類被稱爲參數化的類或參數化的類型。

例:定義一個泛型類

 1 public class Box<T> {
 2    
 3   private T t;
 4 
 5   public void add(T t) {
 6     this.t = t;
 7   }
 8 
 9   public T get() {
10     return t;
11   }
12 
13   public static void main(String[] args) {
14     Box<Integer> integerBox = new Box<Integer>();
15     Box<String> stringBox = new Box<String>();
16 
17     integerBox.add(new Integer(10));
18     stringBox.add(new String("菜鳥教程"));
19 
20     System.out.printf("整型值爲 :%d\n\n", integerBox.get());
21     System.out.printf("字符串爲 :%s\n", stringBox.get());
22   }
23 }
View Code

總結:泛型類型在邏輯上看以當作是多個不一樣的類型,實際上都是相同的基本類型。

3 類型通配符

 1 package test;
 2 
 3 public class GenericTest1 {
 4 
 5     public static void main(String[] args) {
 6         
 7         Box<Double> name = new Box<Double>(1254.0);
 8         Box<Integer> age = new Box<Integer>(712);
 9         Box<Number> number = new Box<Number>(314);
10 
11         getData(name);
12         getData(age);
13         getData(number);
14         
15         getUpperNumberData(name); // 1
16         getUpperNumberData(age);    // 2
17         getUpperNumberData(number); // 3
18     }
19 
20     public static void getData(Box<?> data) {
21         System.out.println("data :" + data.getData());
22     }
23     
24     public static void getUpperNumberData(Box<? extends Number> data){
25         System.out.println("data :" + data.getData());
26     }
27 
28 }
View Code
相關文章
相關標籤/搜索