Java泛型理解

  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类型。

原文地址:https://www.cnblogs.com/award/p/9096779.html