Java泛型理解

Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要Java泛型来大显身手了!

泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。

实例:

一、定义一个泛型方法来打印对象数组元素

  public static <E> void printArray(E[] inputArray){
         for(E elements:inputArray){
             System.out.print(elements);
         }
     }
 
     public static void main(String[] args){
         Integer[] intArray={4,5,6,5,8};
         Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
         Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
         System.out.println( "整型数组元素为:" );
         printArray( intArray  );
 
         System.out.println( "\n双精度型数组元素为:" );
         printArray( doubleArray );
 
         System.out.println( "\n字符型数组元素为:" );
         printArray( charArray );
     }

二、定义一个泛型方法来对数字进行排序(extends 使用)

public static <E extends Comparable> E searchMaxnumber(E x,E y,E z){
         E maxNumber=x;
         if(y.compareTo(maxNumber) > 0){
             maxNumber=y;
         }
         if(z.compareTo(maxNumber)>0){
             maxNumber=z;
         }
         return maxNumber;
     }
 
     public static void main(String[] args){
         System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
                 3, 4, 5, searchMaxnumber( 3, 4, 5 ) );
         System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",
                 6.6, 8.8, 7.7, searchMaxnumber( 6.6, 8.8, 7.7 ) );
         System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear",
                 "apple", "orange", searchMaxnumber( "pear", "apple", "orange" ) );
     }

三、泛型类的定义

public class GenericityExam<E> {
 
    private E e;
 
    public E get(){
        return e;
    }
 
    public void put(E e){
        this.e=e;
    }
 
     public static void main(String[] args) {
         GenericityExam<Integer> integerVal = new GenericityExam<Integer>();
         GenericityExam<Character> charVal = new GenericityExam<Character>();
 
         integerVal.put(new Integer(10));
         charVal.put(new Character('s'));
 
         System.out.printf("整型值为 :%d\n", integerVal.get());
         System.out.printf("字符为 :%c\n", charVal.get());
     }
 
 }

四、类型通配符上限泛型

public static <E> void listGen(List<? extends E> data){<br />    for(E listData:data){<br />        System.out.println("data :" + listData);<br />    }<br />}<br /><br />public static void main(String[] args) {<br />    List<Integer> listIn = new ArrayList<>();<br />    List<Number> listNu = new ArrayList<>();<br /><br />    listIn.add(18);<br />    listIn.add(45);<br />    listNu.add(314);<br />    listNu.add(789);<br /><br />    listGen(listIn);<br />    listGen(listNu);<br />}
  • <? extends E>表示该通配符所代表的类型是E类型的子类。
  • <? super E>表示该通配符所代表的类型是E类型的父类。

泛型定义好后,在运行期间会变化为Object类型。

相关推荐