泛型是JDK 5 中引入的一個新特性,泛型提供了編譯時類型安全檢測機制,該機制容許程序員在編譯時檢測到非法的類型。泛型本質是參數化類型,也就是所操做的數據類型指定爲一個參數。程序員
假定咱們有這樣一個需求:寫一個排序方法,可以對整形數組、字符串數組甚至其餘任何類型的數組進行排序,該如何實現?數組
答案是可使用 Java 泛型。安全
使用 Java 泛型的概念,咱們能夠寫一個泛型方法來對一個對象數組排序。而後,調用該泛型方法來對整型數組、浮點數數組、字符串數組等進行排序。app
1 泛型方法ide
規則:this
例:泛型比較大小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 }
輸出結果: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 }
總結:泛型類型在邏輯上看以當作是多個不一樣的類型,實際上都是相同的基本類型。
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 }