欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java泛型理解

程序员文章站 2022-05-03 14:12:46
Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要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( "\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类型。