【java】浅谈java泛型的安全性

先看一段代码:

ArrayList managers =new ArrayList<>();
ArrayList employees=managers;//报错

  这段代码第二句话会报错,是因为在java中ArrayList和ArrayList没有继承关系(尽管Manager和Employee是继承关系)。
   基于这样的事实,没法让一个参数同时接收ArrayList和ArrayList
这样就导致通过多态(向上转型增强程序的扩展性)的理念没法实现,所以就出现了通配符。

泛型的限定上限定义:

<? extends E> 接受 E 或者 E 的子类型。
泛型的限定下限:
接收 E 或者 E 的父类。

泛型通配符的安全性

使用限定上限时,访问器方法是安全的,更改器方法是不安全的
使用限定下限时,访问器方法是不安全的,更改器方法是安全的

我用如下例子说明
一个类Manager ,继承自类Employee

ArrayList managers=new ArrayList();
managers.set(0,new Employee());//报错
Employee em=managers.get(0);//编译通过

<?extends Employee> 使用set方法时,就好像是向容器里添加Employee,故而会破坏ArrayList
使用get方法时,则是将Manager对象赋值给Employee引用,这是正确的

ArrayList employees=new ArrayList();
employees.set(0,new Manager());//编译通过

使用set方法时,就好像是向容器里添加Manager,不会破坏ArrayList
使用get方法时,则是将Employee对象赋值给Manager引用,这是不安全的,所以会报错。

我们需要知道,泛型的一些设计理念是为了帮助应用程序员排除调用参数上的不必要的限制。

你可能感兴趣的:(【java】浅谈java泛型的安全性)