- 概述
泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。
泛型,就是类型参数。
一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
那么类型参数理解呢?
顾名思义,就是将原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
举个例子:
Arraylist<String> list =new ArrayList<>();
String 就是确定了list中元素类型只能是String,其他类型只能会编译器报错。
泛型的本质是为了参数化类型,(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。
也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
简单泛型类
就是具有几个泛型变量的类
例如:一个泛型变量T(泛型变量的个数是指尖括号中的泛型个数)
public class Pair<T>{private T first;private T second; public T getFirst() { return first; } public void setFirst(T first) { this.first = first; } public T getSecond() { return second; } public void setSecond(T second) { this.second = second; } public Pair(T first, T second) { this.first = first; this.second = second; }}
泛型类也可以有多个类型泛型变量,例如,
public class Pair<T,U>{...}
用具体的类型替换泛型变量就可以实例化简单泛型类,例如:
Pair<String>
泛型简单方法
class ArrayALg{ public static <T> T getMiddle(T... a){ return a[a.length/2]; }}
这个方法是在一般类中定义的,泛型变量
放在 public static 后面。返回类型之前。
调用泛型方法时候,可以省略泛型的参数,编译器会从其他信息中去获取这个泛型是什么数据类型。
String middle=ArrayALg.getMiddle("a","b","c");
哪里用到了泛型,编译器会得到这个泛型的具体信息。
泛型变量限定
这个是计算最小值
public static <T> T min(T[] a){if(a==null || a.length==0)return null;T smallest =a[0];for(int i=1;i<a.length;i++){if(smallest.compareTo(a[i]>0)){smallest=a[i];}return samllest;}}
这个是比较数值,但是泛型是T,表示任何一个类的对象。那怎么去限制T的类型范围?
用关键字extends
将T的范围限制在Comparable接口
public static <T extends Comparable> T min(T[] a)...
一个泛型变量或通配符可以有很多个限定,例如:
T extends Comparable & Serializable
限定类型用&分隔,而逗号来分隔泛型变量
泛型通配符
01.? extends 某一个类
举个例子:
public static void test(Pair<Employee> p){Employee first=p.getFirst();Employee second=p.getSecond();System.out}
02.? super 某一个类
限制泛型是某一个类的超类(父类)。
来源地址:https://blog.csdn.net/qq_38757863/article/details/132560283