Java 通配符主要用来解决泛型设计中类型约束中继承概念所导致的限制,原因则是 Java 泛型中,可以为各种容器和集合来添加类型约束用来获取类型检查功能避免导致错误的类型再程序运行时才会被发现出来。但是却有产生了一些另人烦恼的限制,比如为了保证类型的安全一个 Pair<Employee> 对象是一个 Pair<Manager> 将不会有任何关联,也就是说不能将 Pair<Employee> 和 Pair<Manager> 指向同一个引用,(当然如果说声明了 Pair<Employee> 对象需要把 1 个 Manager 对象存储到其中这样子是可以允许的不会出现错误,因为毕竟 1 个 Manager 也是 1 个 Employee )。所以在这种情况下就需要使用通配符来放宽这样的限制
通配符可以用来实现以下 2 个语法 <? Super Manager> 和 <? Extends Employee> 前者的含义为保存在容器中的对象可以为 Manager 的任何父类,或者是任何 Manager 实现的接口。
而后者则相反为必须继承了 Employee 的子类或者是实现了 Employee 的子类型。而这 2 个语法各支持 1 种操作, <? Super Manager> 支持对数据域的修改,而 <? Extends Employee> 则支持对数据域的访问,上面这 2 个功能个人感觉可以用面向对象程序设计中的继承和多态来解释和理解。个人理解的含义就是如果使用 <? Super Manager> 父类中的数据域同时也会在子类中拥有,所执行提供参数的功能时不会出现任何问题,也就是说不会出现访问一个在父类中不存在的数据域的情况,而如果使用 <? Extends Employee> 子类中包含了父类的所有数据域所有可以实现访问的功能。
总之对这 2 个语法的理解可以为,父类限定通配符可以向泛型对象进行写入,而子类限定通配符则可以向泛型对象读取。
最后通配符的一个应用的语法可以为 Employee<?> ,该语法虽然形式上可能和不带泛型的对象相同,但是任何时 Employee<?> 都要比不带泛型的对象要更好,同时在一些简单的情况下使用这样的语法可以实现一些比使用普通语法更简便和可读性更强的版本