首页 > 编程语言 > 详细

【自学java笔记#第三十天#】泛型设计

时间:2020-04-06 21:06:48      阅读:58      评论:0      收藏:0      [点我收藏+]

选用教材:《Java核心技术卷一》

第八章 泛型程序设计

一、知识点汇总

见思维导图:https://mindmap.airmore.cn/doc/0df803925

二、例题:泛型中的所有方法测试及通配符的使用

//超类Employee类
public class Employee 
{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    

}


package pair3;//Pair类

public class Pair <T>
{
    private T first;
    private T second;
    
    public Pair()
    {
        first=null;
        second=null;
    }
    
    public Pair(T first,T second)
    {
        this.first=first;
        this.second=second;
    }
    
    public T getFirst()
    {
        return first;
    }
    
    public T getSecond()
    {
        return second;
    }
    
    public void setFirst(T newValue)
    {
        first=newValue;
    }
    
    public void setSecond(T newValue)
    {
        second=newValue;
    }

}
//子类Manager类
public class Manager extends Employee
{
    private String name;
    private int bonus;
    private int year;
    private int month;
    private int day;
    
    public Manager(String name, int bonus, int year, int month, int day) 
    {
        this.name=name;
        this.bonus=bonus;
        this.year=year;
        this.month=month;
        this.day=day;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBonus() {
        return bonus;
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
}
//测试类
public class PairTest3
{
    public static void main(String[] args)
    {
        var ceo=new Manager("Gus Greedy",80000,2003,12,15);
        var cfo=new Manager("Sid Sneaky",60000,2003,12,15);
        var buddies=new Pair<Manager>(ceo,cfo);
        printBuddies(buddies);
        
        ceo.setBonus(1000000);
        cfo.setBonus(50000000);
        Manager[] managers= {ceo,cfo};
        
        var result=new Pair<Employee>();
        //var result=new Pair<Manager>();
        //新建一个Employee类的泛型对象result
        //此处创建一个Manager类的泛型对象也是一样的效果
        minmaxBonus(managers,result); //这个方法可以正常使用:先小后大
        System.out.println("first: "+result.getFirst().getName()
                +",second: "+result.getSecond().getName());
        maxminBonus(managers,result);//这个方法也可以正常使用:先大后小
        System.out.println("first: "+result.getFirst().getName()
                +",second:"+result.getSecond().getName());
    }
    
    public static void printBuddies(Pair<?extends Employee>p)//读取一个Manager类的泛型对象
    {
        Employee first=p.getFirst();
        Employee second=p.getSecond();
        System.out.println(first.getName()+" and "+second.getName()+"are buddies.");
    }
    
    public static void minmaxBonus(Manager[]a,Pair<? super Manager>result)
    {
        if(a.length==0) return;
        Manager min=a[0];
        Manager max=a[0];
        for(int i=1;i<a.length;i++)
        {
            if(min.getBonus()>a[i].getBonus()) min=a[i];
            if(max.getBonus()<a[i].getBonus()) max=a[i];
        }
        result.setFirst(min);
        result.setSecond(max);
    }
    
    public static void maxminBonus(Manager[] a,Pair<? super Manager> result)
    {
        minmaxBonus(a,result);
        PairAlg.swap(result);
    }

}

class PairAlg //测试类
{
    public static boolean hasNulls(Pair<?>p)
    //判断p变量是否包含了对象引用,无论对象类型是Manager还是Employee或者Object
    {
        return p.getFirst()==null || p.getSecond()==null;
    }
    
    public static void swap(Pair<?>p) 
    //通配符捕获swapHelper方法中的参数是Pair<T>类型的
    //再结合上下文,可以得知TManager类型的
    {
        swapHelper(p);
    }
    
    public static <T> void swapHelper(Pair<T>p)
    //将一对数里的两个元素交换顺序
    {
        T t=p.getFirst();
        p.setFirst(p.getSecond());
        p.setSecond(t);
    }
}

三、总结

学完泛型,再学完集合和线程,那么JavaSE就算是学完了。但是学到今天,脑袋里都还是一片浆糊的状态。什么时候该用继承,什么时候该用泛型,什么时候该用接口都还是搞不清楚。简单的编程(算法)题能够解出来,一旦涉及到业务逻辑这块,还是需要花很久的时间去理清楚中间的逻辑。希望自己不要用战术上的勤奋去掩盖战略上的懒惰,题要多做,但更要善于总结。

【自学java笔记#第三十天#】泛型设计

原文:https://www.cnblogs.com/yizhinailu/p/12644127.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!