Java基础之<泛型>

泛型类和泛型方法

泛型是Java语言中实现程序多态的一种重要方法,泛型多用于底层代码中,以此来保证代码的通用型。今天咱们就来简单的讲一下泛型中的基本内容

泛型的定义

泛型的定义主要有以下两种:

1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。

上述引用维基百科中对泛型的定义,通俗的讲,在Java中泛型就是可以让类或者方法的输入类型可变,形式上用特殊的符号(例如T,K,V)等来代替原来方法或者类型的参数,可以理解为占位符。这个占位符在程序的编译阶段将被翻译成为我们输入的类型,以此来实现程序的多态。

泛型类

public class Pair
{
    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等都是以泛型类的形式定义的。在类的定义时,在类名之后以作为类型标志,并在类的方法中使用该类型进行参数声明。该类使用时同样以的形式,进行类型的注入。当不进行类型的限定时,类型变量继承于Object类。我们在使用泛型的时候,不能使用类似于int、double等基本类型,而是需要使用Integer、Double等包装类型下面我们来看一个例子

    public static Pair 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,即上述定义的Pair类的一个对象。

        Integer[] words = {3, 7, 9, 2};
        ArrayAlg arrayAlg = new ArrayAlg();
        Pair 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  Pair 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  Pair minmax2(T...a)

则在代码编译的时候,将继承Comparable,也就意味着参数的输入仅可以为实现Comparable接口的类型。

        Double[] words2 = {3.0, 7.0, 9.0, 2.0};
        Pair 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

你可能感兴趣的:(Java基础之<泛型>)