简述泛型的基本使用和作用

打印 上一主题 下一主题

主题 940|帖子 940|积分 2820

前言

在上一篇文章中,给大家讲解了泛型的概念、作用、使用场景,以及泛型集合、泛型接口和泛型类的用法,但受限于篇幅,并没有把泛型的内容讲解完毕。所以今天我们会继续学习泛型方法、泛型擦除,以及通配符等的内容,希望大家继续做好学习的准备哦。
全文大约【4600】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...
一. 泛型方法

1. 简介

我们可以在定义接口和类时使用泛型,这样该接口和类中的所有方法及成员变量等处,也都可以使用该泛型。但其实泛型可以应用在整个类上,也可以只应用在类中的某个方法上。也就是说,方法所在的类可以是泛型类,也可以不是泛型类。方法中是否带有泛型,与其所在的类有没有泛型没有关系。
泛型方法是在调用方法时才确定类型的方法,泛型可以使得该方法独立于类而产生变化。另外,static静态方法无法访问泛型类的类型参数,因此,如果想让一个static方法具有泛型能力,就必须使该静态方法成为泛型方法。
2. 语法

我们在定义泛型方法时,需要在方法名的前面添加类型参数。定义泛型方法的语法格式如下:
  1. [访问权限修饰符] [static] [final] <类型参数列表> 返回值类型 方法名([形式参数列表])
复制代码
例如:
  1. public static <T> List showInfo(Class<T> clazz,int userId){}
复制代码
一般情况下,我们编写泛型方法时,必须在该方法的名称前声明要使用的泛型,并且可以同时声明多个泛型,中间也是用逗号分割。接下来就定义一个泛型方法,给大家具体介绍一下泛型方法的创建和使用。
3. 代码案例

这里我们定义一个泛型方法,用于对数组排序后再遍历元素输出,代码如下:
  1. import java.util.Arrays;
  2. public class Demo04 {
  3.        
  4.         //定义了一个静态的泛型方法,遍历数组中的每个元素
  5.         public static <T> void printArray(T[] arr) {
  6.                 //先对数组进行排序
  7.                 Arrays.sort(arr);
  8.                 //再遍历数组元素
  9.             for (T t : arr) {
  10.                 System.out.print(t + " ");
  11.             }
  12.             System.out.println();
  13.         }
  14.        
  15.         public static void main(String[] args) {
  16.                 Integer[] nums= {100,39,8,200,65};
  17.                 //调用泛型方法
  18.                 printArray(nums);
  19.         }
  20. }
复制代码
在上面的代码中,printArray()就是一个泛型方法,该方法中使用了类型参数T。并且我们在方法的参数中,使用类型参数T定义了一个泛型数组T[],接着对该数组进行排序和遍历。这样以后无论我们传入任何类型的数组,都可以在不进行类型转换的前提下,轻松实现排序等功能了,这样我们之前提的需求也就很容易实现了。
二. 通配符

除了以上这些用法之外,泛型中还有一个很重要的通配符功能,接下来我们就来看看它是怎么回事。
1. 简介

泛型中的通配符其实也是一种特殊的泛型类型,也称为通配符类型参数。利用通配符类型参数,可以让我们编写出更通用的代码,甚至可以在不知道实际类型的情况下使用它们。我们一般是使用 ? 来代替具体的类型参数,例如 List 在逻辑上可以等同于 List、List 等所有 List 的类。
对此,有的小伙伴可能会很好奇,我们为什么需要通配符呢?其实之所以会出现通配符,主要是在开发时,有时候我们需要一个泛型类型,但我们却不知道该使用哪个具体的类型。在这种情况下,我们就可以使用通配符类型参数,让代码更加地通用。比如,我们想编写一个可以接受任何类型的集合,并返回其中最大的元素时,此时我们可能并不确定到底该传入哪个具体的集合,那使用通配符就会更好一些。
2. 通配符的形式

泛型通配符在具体使用时,有如下三种实现形式:

  • 未限定通配符(?)?表示未知类型的通配符
  • 上限通配符(? extends T)?表示类型上限的通配符,T是一个类或接口
  • 下限通配符(? super T)?表示类型下限的通配符,T是一个类或接口
接下来我们针对以上这三种形式,分别通过几个案例来给大家讲解其用法。
3. 未限定通配符(?)

未限定通配符(?)是一种表示未知类型的通配符,它可以在需要一个类型参数的情况下使用。但由于没有限制,因此它只能用于简单的情况,例如集合中的迭代器或者返回类型是泛型的方法等。下面是一个简单的例子:
[code]import java.util.ArrayList;import java.util.List;public class Demo05 {        public static void main(String[] args) {                List names = new ArrayList();                List ages = new ArrayList();                List numbers = new ArrayList();                names.add("一一哥");                names.add("秦始皇");                ages.add(28);                ages.add(50);                ages.add(28);                numbers.add(100);                numbers.add(800);                printElement(names);                printElement(ages);                printElement(numbers);        }        //未限定通配符的使用        public static void printElement(List data) {                for(int i=0;i
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表