Java基础之泛型

泛型类和泛型方法

泛型是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等都是以泛型类的形式定义的。在类的定义时,在类名之后以作为类型标志,并在类的方法中使用该类型进行参数声明。该类使用时同样以的形式,进行类型的注入。当不进行类型的限定时,类型变量继承于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,即上述定义的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


写程序的小火箭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值