选用教材:《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就算是学完了。但是学到今天,脑袋里都还是一片浆糊的状态。什么时候该用继承,什么时候该用泛型,什么时候该用接口都还是搞不清楚。简单的编程(算法)题能够解出来,一旦涉及到业务逻辑这块,还是需要花很久的时间去理清楚中间的逻辑。希望自己不要用战术上的勤奋去掩盖战略上的懒惰,题要多做,但更要善于总结。
原文:https://www.cnblogs.com/yizhinailu/p/12644127.html