java泛型的作用

1,为什么需要泛型?

假设:如果我们要求一个数组中的最大值和最少值,我们要求一次遍历就要求出,现在给定数值是int类型。我们很容易写出下面代码。

//一次遍历求一个数据的最大值和最少值
public class Test {
    public static void main(String[] args) {
        int[] num={234,34,456,2,435,213};
        Pair pairMaxMin=Pair.findMaxMin(num);
        System.out.println("Max="+pairMaxMin.first+"  Min="+pairMaxMin.second);
    }
}
class Pair{
    int first;
    int second;;

    public Pair(int first, int second) {
        this.first = first;
        this.second = second;
    }

    public int getFirst() {
        return first;
    }

    public void setFirst(int first) {
        this.first = first;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }

}

class Tool{
    public Pair findMaxMin(int[] num){
        if(num.length==0) return null;
        int max=num[0];
        int min=num[0];
        for(int i=1;i<num.length;i++){
            if(max<num[i]) max=num[i];
            if(min>num[i]) min=num[i];
        }
        return new Pair(max,min);
    }
}


但是我们的需求变了,给定数组是String类型,那么我们的Pair类中的int是不是要换为String类型。如果没有接触过泛型,我们肯定会再次改Pair类中的代码。

2,介绍泛型
2.1下面我们来引出泛型:泛型意味着编写的代码可以对很多种不同类型的对象重用。
2.2首先我们看到class Pair<T>,这样T就是我们的类型,我们可以把它简单把T想为Int和String然后想往常那样定义。在我们使用时这样定义Pair<Integer> pair1,则把Pair类里的T定义为Integer类型。这样我们就可以存整型数字。而这样定义Pair<String> pair2就能存String类型的。

class Pair<T>{

    T first;
    T second;;

    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;
    }

}

然后我们再改变Tool类里面的代码:
我们可以看到<T extends Comparable>这样的意思的:T作为泛型的标识,T extends Comparable的意思是这个类型是可以排序的,(如果是自己定义的类就要接上Comparable接口,不然编译器就会报错)。Pair<T>是返回方法的类型。

class Tool{

    public  static<T extends Comparable> Pair<T> findMaxMin(T[] num){
        if(num.length==0) return null;
        T max=num[0];
        T min=num[0];
        for(int i=1;i<num.length;i++){
            if(max.compareTo(num[i])<0) max=num[i];//注意这里是对象间的比较用compareTo
            if(min.compareTo(num[i])>0) min=num[i];
        }
        return new Pair(max,min);
    }

}

整体代码,下面我来找整数型的最大和最小与字符串型的最大和最小。

package fan博客;
//一次遍历求一个数据的最大值和最少值
public class Test {
    public static void main(String[] args) {

        Integer[] num={234,34,456,2,435,213};//注意这里由int改为Interger类型了
        Pair numMaxMin=Tool.<Integer>findMaxMin(num);
        System.out.println("Max="+numMaxMin.first+"  Min="+numMaxMin.second);

        String[] strs={"ewgwe","weuiiu","efw","ncx","rew"};
        Pair strMaxMin=Tool.<String>findMaxMin(strs);
        System.out.println("Max="+strMaxMin.first+"  Min="+strMaxMin.second);
    }
}

class Pair<T>{
    T first;
    T second;;

    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;
    }

}
class Tool{

    public  static<T extends Comparable> Pair<T> findMaxMin(T[] num){
        if(num.length==0) return null;
        T max=num[0];
        T min=num[0];
        for(int i=1;i<num.length;i++){
            if(max.compareTo(num[i])<0) max=num[i];
            if(min.compareTo(num[i])>0) min=num[i];
        }
        return new Pair(max,min);
    }

}

3,应用

Find类里的Find是泛型方法,这里可以限定了T是 Employee 子类和包括 Employee 自身,并且这些类实现了comparable接口才能才fun1()函数中使用compateTo。(不满足这些条件就报错)

import java.util.Collection;
import java.util.Comparator;
import java.util.Objects;

public class T3 {
    public static void main(String[] args) {

        pairPeopel<Employee> pair2= Find.fun1(
                new Employee("1",4300),
                new Employee("2",900),
                new Employee("3",4524),
                new Manager("1",5325,-32052)
        );
        System.out.println(pair2.getFirst().salary+"   "+pair2.getSecond().salary);


        pairPeopel<Manager> pair3=Find.fun1(
                new Manager("1",5325,-32052),
                new Manager("2",32,2354),
                new Manager("3",4654,235),
                new Manager("4",5325,324)
        );
        System.out.println(pair3.getFirst().bonus+pair3.getFirst().salary+"   "+(pair3.getSecond().bonus+pair3.getSecond().salary));
    }
}


class pairPeopel<T>{
    T first;
    T second;

    public pairPeopel(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;
    }
}
class Find{
    public static  <T extends Employee&Comparable> pairPeopel<T> fun1(T... people){
        if(people.length==0) return null;
        T max=people[0];
        T min=people[0];
        for(int i=1;i<people.length;i++){
            if(max.compareTo(people[i])<0) max=people[i];
            if(min.compareTo(people[i])>0) min=people[i];
        }
        return new pairPeopel(max,min);
    }

}
class Employee  implements Comparable{
    String name;
    double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }


    @Override
    public int compareTo(Object o) {
        Employee e=(Employee) o;
        return  Double.compare(salary, e.salary);

    }
}

class Manager extends Employee{

    double bonus;
    public Manager(String name, double salary) {
        super(name, salary);
    }
    public Manager(String name, double salary,double bonus) {
        super(name, salary);
        this.bonus=bonus;
    }

    @Override
    public int compareTo(Object o) {
        return Double.compare(bonus,((Manager) o).bonus);
    }

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值