> 文档中心 > 《Java 核心技术 卷1》 笔记 第12章 泛型程序设计(8)无限定通配符

《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》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!