关于java泛型中的extends,super,我们常常见到,但是不是常常蒙B,一会写报错一会读报错。其到底怎么回事,这里作一个浅析,当做自己的笔记。
上代码
public class Food{};
public class Fruitextends Food{}
public class Appleextends Fruit {}
public class Orangeextends Fruit {}
public void test(){
List extendsList =new ArrayList<>();
List superList =new ArrayList<>();
extendsList.add(new Fruit());
Fruit f = extendsList.get(0);
superList.add(new Orange());
superList.add(new Apple());
superList.add(new Fruit());
superList.add(new Food());//只能添加Fruit或其子类
Fruit furit = superList.get(0);
Object obj = superList.get(0);
}
代码非常简单,下面说重点
1.? extends Fruit 的重点是?, extends Fruit 是用来限定?的范围的。限定?为Fruits或其子类。
因为?是Fruits或其子类,当你读取时,可以使用Fruits来接收。当你写入时,由于不确定?到底是哪个具体类型,不能写入。
2.?super Fruit 的重点是?, super Fruit 是用来限定?的范围的。限定?为Fruits或其超类。
因为?为Fruits的超类,当你读取时只能使用Object来接收。当你写入时,已经确定?为Fruits的超类,自然可以写入Fruits或其子类。
Object无法使用子类中的方法,也就基本上没用。
这就是PECS原则,是不是不好记,个人给它改了个名子,egsa(extends get super add),如果你还是记不住就记eg 好了, super是反过来的,如果你还是记不住,你就记章子怡,因为她演过“艺妓回忆录”,艺妓===eg。
如果还记不住,那您受累,换个地方吧。。。