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( " 双精度型数组元素为:" ); 16 printArray( doubleArray ); 17 18 System.out.println( " 字符型数组元素为:" ); 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 ", 14 3, 4, 5, searchMaxnumber( 3, 4, 5 ) ); 15 System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f ", 16 6.6, 8.8, 7.7, searchMaxnumber( 6.6, 8.8, 7.7 ) ); 17 System.out.printf( "%s, %s 和 %s 中最大的数为 %s ","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 ", integerVal.get()); 21 System.out.printf("字符为 :%c ", 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类型。