读书人

泛型 下限与上限

发布时间: 2012-12-19 14:13:14 作者: rapoo

泛型 上限与下限

    //Apple?Orange?都继承自Fruit类,同时Jonathan是Apple的子类,Fruit?继承 Food???List<? extends Fruit> list = new ArrayList<Apple>();???
    ??//list.add(new Apple());??
    ??//list.add(new Fruit());??
    ????
    ??List<? super Fruit> list2 = new ArrayList<Food>();???
    ??list2.add(new Apple());??
    ??list2.add(new Fruit()); ??List<??extends?Fruit>?list?=?new?ArrayList<Apple>(); ?? list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的 ?????List<??extends?Fruit>表示上限是Fruit,下面这样的赋值都是合法的 ?? ???List<??extends?Fruit>?list1?=?new?ArrayList<Fruit>(); ?? ???List<??extends?Fruit>?list2?=?new?ArrayList<Apple>(); ?? ???List<??extends?Fruit>?list3?=?new?ArrayList<Jonathan>(); ?? ???如果List<??extends?Fruit>支持add方法的方法合法的话 ?? ???list1可以add?Fruit和所有Fruit的子类 ?????list2可以add?Apple和所有Apple的子类 ?????list3可以add?Jonathan和所有Jonathan的子类 ?????这样的话,问题就出现了 ?????List<??extends?Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个 ?? ???子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add?Apple ?????的话,可能List<??extends?Fruit>持有的对象是new?ArrayList<Jonathan>() ?? ???Apple的加入肯定是不行的,如果?如果add?Jonathan ?????的话,可能List<??extends?Fruit>持有的对象是new?ArrayList<Jonathan的子类>() ?? ???Jonathan的加入又不合法,所以List<??extends?Fruit>?list?不能进行add ?? ????? ?????而List<??super?Fruit>?list?表示list持有的对象是Fruit的父类,下限是??Fruit,所以list中add?Fruit或Fruit的子类是没有问题的??

读书人网 >编程

热点推荐