泛型类和泛型方法
泛型是Java语言中实现程序多态的一种重要方法,泛型多用于底层代码中,以此来保证代码的通用型。今天咱们就来简单的讲一下泛型中的基本内容
泛型的定义
泛型的定义主要有以下两种:
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。
上述引用维基百科中对泛型的定义,通俗的讲,在Java中泛型就是可以让类或者方法的输入类型可变,形式上用特殊的符号(例如T,K,V)等来代替原来方法或者类型的参数,可以理解为占位符。这个占位符在程序的编译阶段将被翻译成为我们输入的类型,以此来实现程序的多态。
泛型类
public class Pair<T>
{
private T first;
private T second;
public Pair()
{
this.first = null;
this.second = null;
}
public Pair(T first, T second)
{
this.first = first;
this.second = 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; }
}
泛型类是泛型最基本的应用之一,很多JDK源码中的类型,例如List、Map、Set等都是以泛型类的形式定义的。在类的定义时,在类名之后以<T>作为类型标志,并在类的方法中使用该类型进行参数声明。该类使用时同样以<Integer>的形式,进行类型的注入。当不进行类型的限定时,类型变量<T>继承于Object类。我们在使用泛型的时候,不能使用类似于int、double等基本类型,而是需要使用Integer、Double等包装类型下面我们来看一个例子
public static Pair<Integer> minmax(Integer...a)
{
if(a == null || a.length == 0) {return null;}
Integer max = a[0];
Integer min = a[0];
for(Integer num : a)
{
if (min.compareTo(num) > 0) min = num;
if (max.compareTo(num) < 0) max = num;
}
return new Pair<>(min,max);
minmax()方法可以获得一个输入数组的最大值和最小值,方法的返回类型为Pair<Integer>,即上述定义的Pair类的一个对象。
Integer[] words = {3, 7, 9, 2};
ArrayAlg arrayAlg = new ArrayAlg();
Pair<Integer> pair = arrayAlg.minmax(words);
System.out.println("min is : " + pair.getFirst());
System.out.println("max is : " + pair.getSecond());
调用该方法的输出为
min is : 2
max is : 9
泛型方法
上述minmax()方法中使用了泛型类,但该方法却不是一个泛型的方法。该方法规定了我们仅可以输入Interger类型的数据。接下来,我们需要对该方法进行改造,将方法的输入和返回值也改成泛型。即用类型变量T去替代之前方法中的Integer类型。
public static <T> Pair<T> minmax2(T...a)
{
if(a == null || a.length == 0) {return null;}
T max = a[0];
T min = a[0];
for(T num : a)
{
if (min.compareTo(num) > 0) min = num;
if (max.compareTo(num) < 0) max = num;
}
return new Pair<>(min,max);
}
但是进行改造之后,编译器报错,并不能编译通过。原因是因为泛型变量中找不到compareTo()方法。
Error:(56, 20) java: 找不到符号
符号: 方法 compareTo(T)
位置: 类型为T的变量 min
Error:(57, 20) java: 找不到符号
符号: 方法 compareTo(T)
位置: 类型为T的变量 max
类型变量的限定
compareTo()方法是Comparable接口的实现,解决上述编译器错误,需要通过类型变量的限定完成。将方法的声明该成如下形式
public static <T extends Comparable> Pair<T> minmax2(T...a)
则在代码编译的时候,将继承Comparable,也就意味着参数的输入仅可以为实现Comparable接口的类型。
Double[] words2 = {3.0, 7.0, 9.0, 2.0};
Pair<Double> pair2 = arrayAlg.minmax2(words2);
System.out.println("min is : " + pair2.getFirst());
System.out.println("max is : " + pair2.getSecond());
程序的输出为
min is : 2.0
max is : 9.0