前言
在上一篇文章中,给大家讲解了泛型的概念、作用、使用场景,以及泛型集合、泛型接口和泛型类的用法,但受限于篇幅,并没有把泛型的内容讲解完毕。所以今天我们会继续学习泛型方法、泛型擦除,以及通配符等的内容,希望大家继续做好学习的准备哦。
全文大约【4600】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考...
一. 泛型方法
1. 简介
我们可以在定义接口和类时使用泛型,这样该接口和类中的所有方法及成员变量等处,也都可以使用该泛型。但其实泛型可以应用在整个类上,也可以只应用在类中的某个方法上。也就是说,方法所在的类可以是泛型类,也可以不是泛型类。方法中是否带有泛型,与其所在的类有没有泛型没有关系。
泛型方法是在调用方法时才确定类型的方法,泛型可以使得该方法独立于类而产生变化。另外,static静态方法无法访问泛型类的类型参数,因此,如果想让一个static方法具有泛型能力,就必须使该静态方法成为泛型方法。
2. 语法
我们在定义泛型方法时,需要在方法名的前面添加类型参数。定义泛型方法的语法格式如下:- [访问权限修饰符] [static] [final] <类型参数列表> 返回值类型 方法名([形式参数列表])
复制代码 例如:- public static <T> List showInfo(Class<T> clazz,int userId){}
复制代码 一般情况下,我们编写泛型方法时,必须在该方法的名称前声明要使用的泛型,并且可以同时声明多个泛型,中间也是用逗号分割。接下来就定义一个泛型方法,给大家具体介绍一下泛型方法的创建和使用。
3. 代码案例
这里我们定义一个泛型方法,用于对数组排序后再遍历元素输出,代码如下:- import java.util.Arrays;
- public class Demo04 {
-
- //定义了一个静态的泛型方法,遍历数组中的每个元素
- public static <T> void printArray(T[] arr) {
- //先对数组进行排序
- Arrays.sort(arr);
- //再遍历数组元素
- for (T t : arr) {
- System.out.print(t + " ");
- }
- System.out.println();
- }
-
- public static void main(String[] args) {
- Integer[] nums= {100,39,8,200,65};
- //调用泛型方法
- printArray(nums);
- }
- }
复制代码 在上面的代码中,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 |