《Java 核心技术 卷1》 笔记 第12章 泛型程序设计(8)无限定通配符
12.8.2 无限定的通配符
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
public class Main { public static void main(String[] args) { Main solution = new Main(); Parent a = new Parent(); Parent b = new Parent();Son c = new Son(); Son d = new Son(); Pair ancient = new Pair(a,b); ancient.setFirst(a); Pair noGeneric = new Pair(a,b); noGeneric.setFirst(a); }}class Parent{ }class Son extends Parent{ }class Pair{ 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; }@Override public String toString() { return "Pair{" + "first=" + first + ", second=" + second + '}'; }}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
编译结果:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
小总结:
和不写泛型的区别是
(1)写问号无法进行泛型直接接赋值
(2)使用 不会产生警告,而不使用泛型会产生警告
12.8.3 通配符捕获
通配符产生的问题:? 不能作为类型.如下面的写法是不合法的:
? a = pair.getFirst();
处理:带有问号的传参,作为下一方法的泛型类型:
Pair p = xx;
swap(p)
public void swap(T t){….}
具体如下:
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import java.util.Date;import java.util.GregorianCalendar;public class PairTest3 { public static void main(String[] args) { Manager ceo = new Manager("Gus Greedy", 800000,2003,12,15); Manager cfo = new Manager("Sid Sneaky", 600000, 2003, 12,15); Pair buddies = new Pair(ceo,cfo); printBuddies(buddies); ceo.setBonus(100000); cfo.setBonus(50000); Manager[] managers = {ceo,cfo}; Pair result = new Pair(); 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 p){ 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 result){ if(a == null || a.length == 0) return; Manager min = a[0]; Manager max = a[0]; for(int i = 1; i 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 result){ minmaxBonus(a,result); PairAlg.swapHelper(result); }}class PairAlg{ public static boolean hasNulls(Pair p){ return p.getFirst() == null || p.getSecond() == null; }public static void swap(Pair p){ swapHelper(p); }public static void swapHelper(Pair p){ T t = p.getFirst(); p.setFirst(p.getSecond()); p.setSecond(t); }}class Pair{ T first; T second; public Pair(){} 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 Employee{ private String name; private double salary; private Date hireDay;public Employee(String n, double s, int year, int month, int day){ name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year,month-1, day); hireDay = calendar.getTime(); }public String getName() { return name; }public void setName(String name) { this.name = name; }public double getSalary() { return salary; }public void setSalary(double salary) { this.salary = salary; }public Date getHireDay() { return hireDay; }public void setHireDay(Date hireDay) { this.hireDay = hireDay; }}class Manager extends Employee{ private double bonus;public Manager(String n, double s, int year, int month, int day) { super(n, s, year, month, day); bonus = 0; }@Override public double getSalary() { double baseSalary = super.getSalary(); return baseSalary+bonus; }public double getBonus() { return bonus; }public void setBonus(double bonus) { this.bonus = bonus; }}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
结果:
小总结:?代表的通配符类型,虽然无法直接作为类型使用,但是可以通过传递到新的方法中,重新建立泛型来使用。
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!