Java 泛型用法详解

java 泛型是JDK 5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质时参数化类型,也就是说所操作的数据类型被指定为一个参数。

假定我们有这样一个需求:写一个排序算法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用Java泛型。

使用Java泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。

我们可以写一个泛型方法,该方法在调用时可以接受不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

定义泛型方法的规则:

1:所有泛型方法声明都有一个类型参数声明部分(有尖括号分隔),该类型参数声明部分在方法返回类型之前。

2:每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。

3:类型参数能被用来声明返回值类型,并且能作为泛型方法得到实际参数类型的占位符。

4:泛型方法体的声明和其他方法一样。注意类型参数只能代表引用类型,不能是原始类型。

使用泛型方法打印不同字符串的元素:

public class Test{
    //泛型方法printArray
    public static <E> void printArray(E[] inputArray){
        //输出数组元素
        for(E element : inputArray){
            System.out.printf("%s",element);
        }
        System.out.println();
    }

    public static void main(String[] args){
        //创建不同类型数组
        Integer[] intArray = {1,2,3,4,5};
        Double[] doubleArray = {1.1,2.2,3.3,4.4,5.5};
        Character[] charArray = {'h','e','l','l','o'};

        System.out.println("整型数组元素为:");
        printArray(intArray);//传递一个整型数组

        System.out.println("\n双精度型数组元素为:");
        printArray(doubleArray);//传递一个双精度型数组

        System.out.println("\n字符型数组元素为:");
        printArray(charArray);//传递一个字符型数组

    }
}

 有界的类型参数:

有些时候,我们需要限制那些被允许传递到一个类型参数的类型种类范围。例如,一个曹祖数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。

要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

例如,利用泛型方法返回三个课比较对象的最大值:

public class MaximumTest{
    //比较三个值并返回最大值
    public static <T extends Comparable<T>> T maximum(T x, T y, T z){
        T max = x;//假设x是初始最大值
        if(y.compareTo(max)>0){
            max = y;//y更大
        }
        if(z.compareTo(max)>0){
            max = z;
        }
        return max;
    }
    public static void main(String[] args){
        System.out.printf("%d, %d 和 %d中最大的数为 %d \n\n",3,4,5,maximum(3,4,5));
        System.out.printf("%f, %f 和 %f中最大的数为 %f \n\n",3.2,4.6,5.1,maximum(3.2,4.6,5.1));
        System.out.printf("%s, %s 和 %s中最大的数为 %s \n\n","pear","apple","orange",maximum("apple","pear","orange"));
    }
}

猜你喜欢

转载自blog.csdn.net/li_w_ch/article/details/108444343