苏迪科技技术交流吧 关注:9贴子:34
  • 1回复贴,共1

关于泛型中super和extends用法

只看楼主收藏回复

Class RedApple extends Apple{}
Class Apple extends Fruit{}
Class Friut extends Food{}下面讨论List<? extends Class ?>和List<? super Class ?>用法。例如:
List<? extends Fruit> fruitEntity = new ArrayList<Apple>,左边表示List类型上限是Fruit,可以表示是Fruit,Apple,RedApple中的任一个;
此时你可能想到这样:fruitEntity.add(new Apple());
fruitEntity.add(new RedApple());看上去好像是没什么问题,但实际上这是错误的用法;以上不等同于List<Apple> fruitEntity = new ArrayList<Apple>,如果是这样便可以那样add;
List<? extends Fruit> fruitEntity = new ArrayList<Apple>虽然已经new个实例出来,但编译器是不能识别的,它是在编译是会根据你的New出来的类型自己会在其范围内找到对应该的类给你填上,但是我们写这样的代码它是不能识别的,它还是表示一个上限是Fruit的范围,所以我们在用add方法时会有这样的问题:比如fruitEntity.add(new Apple());当前类不一定表示Apple类或者是其父类,它可能是RedApple类,这样你add(new Apple())明显是不合理的;总体是这样:在没编译时他不知道自己表示是哪个类,而却向其add一个具体的类是说不过去的。
与之对应的是List<? super Fruit> fruitEntity = new ArrayList<Fruit>;这种情况正好和上一个情况是相反的。它表示当前list类型下限为Fruit,即可能是Fruit,Food,Object同理它不等同于List<Fruit> fruitEntity = new ArrayList<Fruit>;但是它是可以执行那样的add方法,即:fruitEntity.add(new Apple());fruitEntity.add(new RedApple());因为它表示的下限是Fruit ,向其中加RedApple,Apple是没有问题的,因为它们已被确定是其子类。同样的道理;fruitEntity.add(new Food()),fruitEntity.add(new Object());这样加是不行的,,它不知道上限是哪个,所以不能这样加!
在网上看了相关的,不过说的不是很清楚,在此按自己的理解理一下。


IP属地:上海1楼2012-12-08 13:00回复
    好贴~学习了


    2楼2013-07-02 16:14
    回复