先看一段代码:
ArrayList<Manager> managers =new ArrayList<>();
ArrayList<Employee> employees=managers;//报错
这段代码第二句话会报错,是因为在java中ArrayList<Manager>和ArrayList<Employee>没有继承关系(尽管Manager和Employee是继承关系)。
基于这样的事实,没法让一个参数同时接收ArrayList<Manager>和ArrayList<Employee>
这样就导致通过多态(向上转型增强程序的扩展性)的理念没法实现,所以就出现了通配符。
泛型的限定上限定义:
<? extends E> 接受 E 或者 E 的子类型。
泛型的限定下限:
<? super E> 接收 E 或者 E 的父类。
泛型通配符的安全性
使用限定上限时,访问器方法是安全的,更改器方法是不安全的
使用限定下限时,访问器方法是不安全的,更改器方法是安全的
我用如下例子说明
一个类Manager ,继承自类Employee
ArrayList<? extends Employee> managers=new ArrayList<Manager>();
managers.set(0,new Employee());//报错
Employee em=managers.get(0);//编译通过
<?extends Employee> 使用set方法时,就好像是向容器里添加Employee,故而会破坏ArrayList<Manager>;
使用get方法时,则是将Manager对象赋值给Employee引用,这是正确的
ArrayList<? super Manager> employees=new ArrayList<Employee>();
employees.set(0,new Manager());//编译通过
<? super Manager> 使用set方法时,就好像是向容器里添加Manager,不会破坏ArrayList<Employee>;
使用get方法时,则是将Employee对象赋值给Manager引用,这是不安全的,所以会报错。
我们需要知道,泛型的一些设计理念是为了帮助应用程序员排除调用参数上的不必要的限制。
网友评论